2013-02-22 2 views
0
나는 다음과 같은 행에 선적 정보를 두 개의 테이블을 가지고 서버 2005

SQL :방법을 선택 만 1 행 최신 날짜

TABLE1: SHIPMNT_NO 
     SHIPMNT_LN_NO 
     CUSTOMER 

TABLE2: SHIPMNT_NO 
     SHIPMNT_LN_NO 
     SHIP_DT 
     QTY 

SHIPMNT_NO에 대해 동일한 값을 TABLE2에 여러 행이 있습니다 및 SHIPMNT_LN_NO와 같지만 배송 날짜 (SHIP_DT)에 대해 다른 값을가집니다.

SHIPMNT_NO SHIPMNT_LN_NO SHIPMNT_DT 
965271   1    2013-02-07 00:00:00.000 
965271   1    2013-02-12 00:00:00.000 
965271   1    2013-02-14 00:00:00.000 
965271   1    2013-02-16 00:00:00.000 
965271   1    2013-02-18 00:00:00.000 

나는 SHIPMNT_NO 및 SHIPMNT_LN_NO 함께 테이블에 가입해야합니다. 하지만 가장 최근의 날짜 (SHIPMNT_DT)를 갖는 고유 한 SHIPMNT_NO 및 SHIPMNT_LN_NO 행만 있으면됩니다.

select a.SHIPMNT_NO, a.SHIPMNT_LN_NO, b.QTY 
from TABLE1 a join TABLE2 b on b.SHIPMNT_NO = a.SHIPMNT_NO 
          and b.SHIPMNT_LN_NO = a.SHIPMNT_LN_NO 
Where????? 

은 어떻게 WHERE 함께 할 또는 가입 또는 하위 쿼리 할 수 ​​있습니까?

바라는대로 내가 성취하려는 것이 분명하지만 더 많은 정보가 필요하면 알려 주시기 바랍니다.

+3

이유는 무엇입니까? 왜 열 이름에 'E'라는 문자가 없습니까? *** SHIPMENT보다 SHIPMNT를 입력하는 것이 얼마나 어렵습니까 *** 알고 계십니까? –

+0

@AaronBertrand 나는 시간 절약을 위해 약어 *를 넣을 것입니다. - 그것은 _DT로 단축 된'_DATE '와 쌍으로 나타납니다. 나는이 이름들을 타이핑 할 때 정말로 * 집중해야한다고 확신한다. – andr

+1

@andr 예, 알겠습니다. 매우 불편한 약어라고 생각합니다. 모음이 유용합니다. –

답변

0

당신은 ROW_NUMBER() 함수를 원하는 :

select SHIPMNT_NO, SHIPMNT_LN_NO, QTY 
from (select a.SHIPMNT_NO, a.SHIPMNT_LN_NO, b.QTY, 
      row_number() over (partition by shipmnt_no, shipmnt_ln_no order by shipmnt_dt desc) as seqnum 
     from TABLE1 a join TABLE2 b on b.SHIPMNT_NO = a.SHIPMNT_NO 
         and b.SHIPMNT_LN_NO = a.SHIPMNT_LN_NO 
    ) t 
where seqnum = 1 

row_number() 함수는 그룹의 행에 일련 번호를 지정합니다. 이 경우 그룹은 발송물 설명에 의해 정의됩니다. 주문은 shipment_dt에 의해 정의되며 가장 최근의 값은 1입니다.

의 동점이있는 그룹 (같은 그룹에 같은 날짜가있는 행 2 개)을 원할 경우, row_number() 대신 rank()을 사용하십시오.

+0

절대적으로 똑똑! partitioning을 사용하는 row_number() 함수가 트릭을 수행했습니다! 그리고 나는 오늘 새로운 것을 배웠다. :) – zanq

2
;WITH x AS 
(
    SELECT a.SHIPMNT_NO, a.SHIPMNT_LN_NO, b.QTY, b.SHIPMNT_DT, 
     rn = ROW_NUMBER() OVER 
     (
     PARTITION BY a.SHIPMNT_NO, a.SHIPMNT_LN_NO 
     ORDER BY b.SHIPMNT_DT DESC 
    ) 
    FROM dbo.TABLE1 AS a 
    INNER JOIN dbo.TABLE2 AS b 
    ON b.SHIPMNT_NO = a.SHIPMNT_NO 
    AND b.SHIPMNT_LN_NO = a.SHIPMNT_LN_NO 
) 
SELECT SHIPMNT_NO, SHIPMNT_LN_NO, QTY --, SHIPMNT_DT 
FROM x WHERE rn = 1;