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
非常感谢任何帮助,蒂姆。
答
这将是这样的:
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
使用ROW_NUMBER OVER(PARTITION BY itemID ORDER BY someother col)as rn .. WHERE rn = 1 – Mihai 2014-10-06 21:56:23
这很大程度上取决于您要查看每个itemID的哪个实例... – 2014-10-06 21:57:32
@DanielE .:谢谢 - 我只想要查看最新的实例,即使用最新的modTime。 – user2571510 2014-10-06 22:02:04