SQL Server:如何选择仅查看一列的唯一值

问题描述:

我使用以下查询(在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

这将是这样的:

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