T-SQL如何获取前三大计数值并包含所有对应并列重复记录
你需要使用DENSE_RANK()窗口函数实现按档位筛选的需求,该函数会为相同的计数值分配相同的排名,且排名不会跳号,完全匹配你所说的“档”的定义。
实现代码
WITH PlanStats AS ( SELECT b.planID, COUNT(b.planID) AS PopularPlan, DENSE_RANK() OVER(ORDER BY COUNT(b.planID) DESC) AS PlanRank FROM dbo.Subscriber AS b GROUP BY b.planID ) SELECT planID, PopularPlan FROM PlanStats WHERE PlanRank <= 3 ORDER BY PopularPlan DESC;
原方案问题说明
你之前使用TOP 3 WITH TIES没有达到预期,是因为TOP N WITH TIES的逻辑是:先取排序后的前N行,再返回所有和第N行排序字段值相同的行。你的示例中排序后的第3行计数值为2390,所以只会返回所有计数值等于2390及更高的记录,自然不会包含第三档的2090。
用DENSE_RANK生成的排名中,你的示例数据对应排名为:
- 2555对应排名1
- 2390对应排名2
- 2090对应排名3
- 2080对应排名4
筛选PlanRank <=3就可以自动覆盖前3个档位的所有并列记录,完全符合你的预期输出。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

