2014-10-06 320 views
0

我使用以下查詢(在SQL Server 2008中)從表中提取最後20條記錄。SQL Server:如何選擇僅查看一列的唯一值

查詢按預期工作,我唯一的問題是這是一個日誌表,其中某個itemID可能會出現多次。 有沒有一種方法可以在這裏選擇唯一的itemID? 我嘗試使用DISTINCT,但這不起作用,因爲不是整行都重複,只是itemid可以出現多次(然後時間戳或其他數據不同)。

我的SQL:

ALTER PROCEDURE [dbo].[RC_FetchUpdates] 
    @departmentID int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT  TOP 20 A.itemID, 
       A.lastUpdate, 
       CONVERT(VARCHAR(11), A.modTime, 106) AS modTime, 
       A.modBy, 
       B.itemName, 
       B.linkRef 
    FROM  RC_LogLinks A 
    LEFT JOIN RC_Links B 
    ON   B.itemID = A.itemID 
    WHERE  B.departmentID = @departmentID 
    AND   A.lastUpdate <> 'Deleted' 
    ORDER BY A.modTime desc, B.itemName 
    FOR XML PATH('updates'), ELEMENTS, TYPE, ROOT('ranks') 

END 

非常感謝任何幫助,蒂姆。

+3

使用ROW_NUMBER OVER(PARTITION BY itemID ORDER BY someother col)as rn .. WHERE rn = 1 – Mihai 2014-10-06 21:56:23

+1

這很大程度上取決於您要查看每個itemID的哪個實例... – 2014-10-06 21:57:32

+0

@DanielE .:謝謝 - 我只想要查看最新的實例,即使用最新的modTime。 – user2571510 2014-10-06 22:02:04

回答

2

這將是這樣的:

WITH rankedLogLinks AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY A.itemID ORDER BY A.modTime DESC) AS rownum, A.itemID, A.lastUpdate, A.modTime, A.modBy 
    FROM RC_LogLinks A 
    WHERE A.lastUpdate <> 'Deleted' 
) 
SELECT r.itemID, r.lastUpdate, CONVERT(VARCHAR(11), r.modTime, 106) AS modTime, r.modBy, B.itemName, B.linkRef 
FROM rankedLogLinks r 
    LEFT JOIN RC_Links B 
     ON B.itemID = r.itemID 
    WHERE B.departmentID = @departmentID 
     AND r.rownum = 1 
    ORDER BY B.itemName 
    FOR XML PATH('updates'), ELEMENTS, TYPE, ROOT('ranks') 
; 

您可能需要更改的WHERE A.lastUpdate <>第一個查詢到根據您的要求,第二個「刪除」的位置。

+0

這是完美的,幫助很大 - 非常感謝! – user2571510 2014-10-07 06:01:22