0

SQLServer2005。次の行に出荷情報を含む2つのテーブルがあります。

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 になります。

同順位 (同じグループ内の同じ日付の 2 つの行) がある可能性がありそれらすべてが必要な場合は、rank()代わりに を使用しrow_number()ます。

于 2013-02-22T00:13:09.230 に答える