SQL查询去重求助:同SessionID仅保留一行的实现方案
解决方案:针对SessionID去重的SQL查询优化
先修正原查询的语法错误
原语句中ORDER BY SCS.UserName ASC的SCS是无效表别名,应改为S.UserName,这可能是导致之前操作未达预期的原因之一。
方案1:使用DISTINCT(适用于同SessionID对应所有列完全重复的场景)
直接在SELECT后添加DISTINCT关键字,过滤完全重复的行:
SELECT DISTINCT S.SessionID , S.UserName , S.MachineName , I.SrvName , A.ApplicationName , A.WindowUniqueID FROM Inventory I INNER JOIN Session S ON S.SrvID = I.SrvID LEFT JOIN Application A ON S.SessionID = A.SSessionID AND S.SessionDay = A.SessionDay WHERE S.Date >= '2021-08-26' AND S.Date < '2021-08-30' ORDER BY S.UserName ASC
方案2:使用ROW_NUMBER()窗口函数(适用于同SessionID对应列存在差异,需保留任意一行的场景)
通过窗口函数按SessionID分区,为每个分区的行编号,仅保留编号为1的行:
WITH RankedSessions AS ( SELECT S.SessionID , S.UserName , S.MachineName , I.SrvName , A.ApplicationName , A.WindowUniqueID -- 按SessionID分区,随机取一行;若需指定规则,可替换(SELECT NULL)为排序字段,比如A.WindowUniqueID DESC , ROW_NUMBER() OVER (PARTITION BY S.SessionID ORDER BY (SELECT NULL)) AS rn FROM Inventory I INNER JOIN Session S ON S.SrvID = I.SrvID LEFT JOIN Application A ON S.SessionID = A.SSessionID AND S.SessionDay = A.SessionDay WHERE S.Date >= '2021-08-26' AND S.Date < '2021-08-30' ) SELECT SessionID , UserName , MachineName , SrvName , ApplicationName , WindowUniqueID FROM RankedSessions WHERE rn = 1 ORDER BY UserName ASC
方案3:使用GROUP BY(适用于同SessionID对应所有列完全一致的场景)
将SELECT中的所有非聚合列加入GROUP BY子句,实现去重:
SELECT S.SessionID , S.UserName , S.MachineName , I.SrvName , A.ApplicationName , A.WindowUniqueID FROM Inventory I INNER JOIN Session S ON S.SrvID = I.SrvID LEFT JOIN Application A ON S.SessionID = A.SSessionID AND S.SessionDay = A.SessionDay WHERE S.Date >= '2021-08-26' AND S.Date < '2021-08-30' GROUP BY S.SessionID , S.UserName , S.MachineName , I.SrvName , A.ApplicationName , A.WindowUniqueID ORDER BY S.UserName ASC
内容的提问来源于stack exchange,提问作者pantelis
相关产品推荐
相关产品推荐

