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

我有第二个表将条形码链接到产品。表名是条形码。

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

我需要加入表格但没有重复的条形码值。如果有重复,则应选择较高的 TimeStamp。所以结果应该是这样的:

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

请注意,在第三行返回 ProductID 的空值非常重要。

我已经尝试使用 DISTINCT、PARTITION BY 和 GROUP BY,但是我为消除重复而遵循的示例没有加入第二个表。

4

2 回答 2

2

这是这样做的一种方法: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 回答