You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:35:25