2013-02-22 43 views
0

SQL Server 2005中我有以下行出货量信息,两个表:如何只选择1行最新的日期

TABLE1: SHIPMNT_NO 
     SHIPMNT_LN_NO 
     CUSTOMER 

TABLE2: SHIPMNT_NO 
     SHIPMNT_LN_NO 
     SHIP_DT 
     QTY 

有表2中多行与SHIPMNT_NO相同的值和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_NO和SHIPMNT_LN_NO行(SHIPMNT_DT)。

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什么或JOIN或SUBQUERY?

希望它清楚我正在努力完成的任务,但如果您需要更多信息,请让我知道。

+3

为什么,为什么你的列名没有字母'E'?你知道输入'SHIPMNT'比'发货'要难吗? – 2013-02-22 00:16:12

+0

@AaronBertrand我敢打赌这是一个缩写*以节省时间* - 它与'_DATE'成对,缩短为'_DT'。我敢肯定,在输入这​​些名字时,必须*真正*集中注意力。 – andr 2013-02-22 00:48:47

+1

@andr是的,我明白了,我认为这是一个非常不方便的缩写。元音很有用。 – 2013-02-22 00:58:35

回答

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

的值。如果你认为你可能有关系(两行同日在同一组)你希望所有的人,然后使用rank()而不是row_number()

+0

绝对精彩! row_number()函数与分区做了诀窍!我今天学到了一些新东西:) – zanq 2013-02-22 02:33:35

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;