查询以消除重复并报告空值

时间:2013-02-22 00:22:33

标签: sql-server-2008 tsql

我正在使用SQL Server 2008.我有一个包含来自handcanner的数据的表。表名是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,但是我为了消除重复而遵循的示例没有连接第二个表。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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),您可以按降序日期顺序为每个条形码分配行号。然后,仅选择每个条形码组中的第一行。