0

SQL Server 2005。我有两个表,其中包含以下行中的发货信息:

TABLE1: SHIPMNT_NO
        SHIPMNT_LN_NO
        CUSTOMER

TABLE2: SHIPMNT_NO
        SHIPMNT_LN_NO
        SHIP_DT
        QTY

TABLE2 中有多个行,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_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、JOIN 或 SUBQUERY 做什么?

希望很清楚我要完成的工作,但如果您需要更多信息,请告诉我。

4

2 回答 2

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;
于 2013-02-22T00:14:02.347 回答
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()函数为组中的行分配一个序号。在这种情况下,组由装运描述定义。排序由 shipping_dt 定义,最近的值为 1。

如果您认为您可能有联系(同一组中具有相同日期的两行)并且您想要所有这些,请使用rank()而不是row_number().

于 2013-02-22T00:13:09.230 回答