2013-02-22 69 views
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 

我需要加入表格但沒有重複的條形碼值。在有重複的地方,應該選擇較高的時間戳。所以結果應該如下所示:

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 

請注意,爲產品ID返回第三行的值爲空值非常重要。

我已經嘗試過使用DISTINCT,PARTITION BY和GROUP BY,但是我所遵循的用於消除重複的示例沒有加入第二個表。

回答

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 
+0

感謝您的幫助,並在sqlfiddle中顯示它。漂亮的工具。 – 2013-02-22 12:39:06

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)你分配一個行號以降序的日期順序每個條形碼。然後,只選擇每個條形碼組中的第一行。

+0

這也工作過。這與zespri的方法的效率比較如何? – 2013-02-22 12:41:17