SQL中Rank函数返回并列第一记录时,如何配置自定义决胜条件?
解决方案:优化排名逻辑添加决胜规则
当然可以用SQL实现你的需求,只需要调整窗口函数的排序规则,把你的决胜条件加到排名逻辑里就行,而且建议改用row_number()来确保每个分组只返回一条最终记录。
修改后的完整SQL代码
with Stays as ( select [Site], Reservation, Arrival, Departure, Category, count(*) as [Count], -- 提取该分组下最早的创建日期,用于决胜判断 min(CreateDate) as EarliestCreateDate, row_number() over ( partition by [Site], Reservation -- 排序优先级:先按类别出现次数降序,再优先Owner,最后取创建最早的 order by count(*) desc, case when Category = 'Owner' then 0 else 1 end asc, min(CreateDate) asc ) RankNum from #Reservations group by [Site], Reservation, Arrival, Departure, Category ) select [Site], Reservation, Arrival, Departure, Category, [Count] from Stays where RankNum = 1
关键调整说明
- 替换
rank()为row_number():原rank()会给排序条件相同的记录分配相同排名,导致出现多个RankNum=1的情况;row_number()能确保每个[Site], Reservation分组下只会生成唯一的排名1记录。 - 分层排序逻辑:
- 第一优先级:保留原逻辑,按Category的出现次数
count(*)降序排列; - 第二优先级:用
case表达式标记Owner类别(给Owner赋值0,其他类别赋值1),升序排序时Owner会被优先选中; - 第三优先级:取每个分组内最早的创建日期升序排列,解决非Owner类别之间的平局问题。
- 第一优先级:保留原逻辑,按Category的出现次数
- 注意创建日期字段:如果你的数据集里创建日期字段不是
CreateDate,把代码里的CreateDate替换成实际字段名即可。
内容的提问来源于stack exchange,提问作者Supafly
相关产品推荐
相关产品推荐

