如何修改SQL内连接查询以显示包含并列的前3周高分
修改SQL语句以包含并列的前3名高分数据
原SQL语句用TOP(3)只能返回前3条记录,没法处理分数并列的情况(比如示例里Bill和Ben同是123分,都该算作前3名)。要实现包含并列的前3名展示,我们可以用DENSE_RANK()窗口函数给每个用户的总分排名,再筛选排名≤3的记录:
WITH RankedScores AS ( SELECT tblAccounts.accountID, tblAccounts.contactName, SUM(MONMWins.Points) AS ttlPoints, DENSE_RANK() OVER(ORDER BY SUM(MONMWins.Points) DESC) AS scoreRank FROM MONMWins INNER JOIN tblAccounts ON MONMWins.accountID = tblAccounts.accountID WHERE MONMWins.dateAdded > DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6) GROUP BY tblAccounts.accountID, tblAccounts.contactName ) SELECT accountID, contactName, ttlPoints FROM RankedScores WHERE scoreRank <= 3 ORDER BY ttlPoints DESC, contactName;
说明:
DENSE_RANK()会给相同总分的用户分配相同排名,且排名连续(比如1、2、2、3),不会因并列跳过排名- 先用CTE计算每个用户的总分和排名,再筛选排名≤3的记录,就能保留所有并列的前3名
- 保留了原语句中筛选上周数据、按总分降序+姓名排序的逻辑
执行后就能得到和示例一致的结果:所有总分排在前3位(含并列)的用户都会被展示出来。
内容的提问来源于stack exchange,提问作者Eggybread
相关产品推荐
相关产品推荐

