基于ContactID和ServiceID分组对SessionID按Created降序排名的SQL问题
问题分析
你的查询不符合需求的核心原因是分区字段错误:原语句在PARTITION BY中额外加入了SESSIONID,导致每个SESSIONID单独成为一个分区,每个分区内仅一条数据,排名自然全为1,完全无法实现按ContactID + ServiceID组合分组对SESSIONID排名的目标。
解决方案
根据你的需求,需按ContactID和ServiceID组合分组,依据Created日期降序对SESSIONID排名,分两种场景处理:
场景1:同一SESSIONID在分组下有多条记录,按该SESSIONID的最新创建时间排名
先聚合每个SESSIONID在对应分组内的最新创建时间,再进行排名:
WITH SessionLatest AS ( SELECT ContactID, ServiceID, SESSIONID, MAX([Created]) AS LatestCreated FROM #TABLE GROUP BY ContactID, ServiceID, SESSIONID ) SELECT ContactID, ServiceID, SESSIONID, ROW_NUMBER() OVER (PARTITION BY ContactID, ServiceID ORDER BY LatestCreated DESC) AS rn1, RANK() OVER (PARTITION BY ContactID, ServiceID ORDER BY LatestCreated DESC) AS rn2, DENSE_RANK() OVER (PARTITION BY ContactID, ServiceID ORDER BY LatestCreated DESC) AS rn3 FROM SessionLatest
场景2:每条记录对应唯一SESSIONID,直接按单条记录的Created时间排名
如果每个SESSIONID在同一分组下仅一条记录,直接修改分区字段即可:
SELECT ContactID, ServiceID, SESSIONID, [Created], ROW_NUMBER() OVER (PARTITION BY ContactID, ServiceID ORDER BY [Created] DESC) AS rn1, RANK() OVER (PARTITION BY ContactID, ServiceID ORDER BY [Created] DESC) AS rn2, DENSE_RANK() OVER (PARTITION BY ContactID, ServiceID ORDER BY [Created] DESC) AS rn3 FROM #TABLE
排名函数差异说明
ROW_NUMBER():同一分组内,即使Created时间相同,也生成连续的唯一排名(如1,2,3)RANK():同一分组内,相同Created时间获相同排名,后续排名跳过相同数量位数(如1,1,3)DENSE_RANK():同一分组内,相同Created时间获相同排名,后续排名连续不跳过(如1,1,2)
内容的提问来源于stack exchange,提问作者r-magalhaes
相关产品推荐
相关产品推荐

