0

SQL Server 2008 を使用しています。ハンドスキャナーからのデータを含むテーブルがあります。テーブル名は ScanData です。

Barcode  ScanDate                   ScannerId
*******  ********                   *********
A000012  2013-02-19 11:55:02.900    SGH205YXHD
A000015  2013-02-21 11:30:02.767    SGH205YXHD
A000017  2013-02-21 11:29:19.507    SGH205YXHD
A000012  2013-02-19 10:58:02.900    5C7152P0SB
A000015  2013-02-19 10:41:02.400    SGH205YXHD
A000018  2013-02-19 10:25:02.140    5C7152P0SB

バーコードを製品にリンクする 2 番目のテーブルがあります。テーブル名はバーコードです。

Barcode  ProductID
*******  *********
A000012  CCC3047A-2E85-413F
A000015  2C4CD739-F09D-44D0
A000018  F48C9B37-7B2F-4446

テーブルを結合する必要がありますが、バーコード値が重複していません。重複がある場合は、より高いタイムスタンプを選択する必要があります。したがって、結果は次のようになります。

Barcode  ScanDate                   ScannerId    ProductID
*******  ********                   *********    *********
A000012  2013-02-19 11:55:02.900    SGH205YXHD   CCC3047A-2E85-413F
A000015  2013-02-21 11:30:02.767    SGH205YXHD   2C4CD739-F09D-44D0
A000017  2013-02-21 11:29:19.507    SGH205YXHD   null
A000018  2013-02-19 10:25:02.140    5C7152P0SB   F48C9B37-7B2F-4446

3 行目の ProductID が null 値で返されることが非常に重要であることに注意してください。

DISTINCT、PARTITION BY、および GROUP BY を使用して試みましたが、重複を排除するために従った例では、2 番目のテーブルが結合されていませんでした。

4

2 に答える 2

2

これはこれを行う 1 つの方法です: http://www.sqlfiddle.com/#!3/0763a/1

select 
    ScanData.Barcode, 
    ScanData.ScanDate, 
    ScanData.ScannerId,
    Barcode.ProductID
From
    ScanData
Left Join
    Barcode
on
    ScanData.Barcode = Barcode.Barcode
join 
(
    select 
        Barcode, 
        max(ScanDate) ScanDate 
    from 
        ScanData 
    Group By Barcode
) Latest
On
    Latest.Barcode = ScanData.Barcode and Latest.ScanDate = Scandata.ScanDate
Order By
    Barcode
于 2013-02-22T00:59:19.443 に答える
1

次のようなことができます。

;WITH ScanData_CTE AS
  (
  SELECT sd.Barcode, sd.ScanDate, sd.ScannerId, b.ProductID,
    row_number() over (partition BY sd.Barcode ORDER BY sd.ScanDate DESC) AS rn
  FROM ScanData sd
  LEFT OUTER JOIN Barcode b ON sd.Barcode = b.Barcode
  )

SELECT Barcode, ScanDate, ScannerId, ProductID
FROM ScanData_CTE
WHERE rn = 1

共通テーブル式 (CTE) を使用して、バーコードごとに降順で行番号を割り当てます。次に、各バーコード グループの最初の行のみを選択します。

于 2013-02-22T00:35:33.277 に答える