我正在使用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,但是我为了消除重复而遵循的示例没有连接第二个表。
答案 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),您可以按降序日期顺序为每个条形码分配行号。然后,仅选择每个条形码组中的第一行。