如何获取数据表中成绩排名前二的记录(含并列情况)
解决方案
要实现找出成绩最高的两位人员(含并列情况),可以用以下两种常用方法:
方法一:使用窗口函数(推荐,简洁直观)
利用DENSE_RANK()窗口函数可以轻松处理并列排名的场景,它会给相同成绩的用户分配相同的排名,且排名是连续的(比如1,1,2,2,不会跳过数字)。
步骤是先算出每个用户的最高成绩,再对这些成绩进行排名,最后筛选排名≤2的记录:
WITH user_max_grades AS ( SELECT name, MAX(grade) AS max_grade FROM exercise_5 GROUP BY name ), ranked_grades AS ( SELECT name, max_grade, DENSE_RANK() OVER (ORDER BY max_grade DESC) AS grade_rank FROM user_max_grades ) SELECT name, max_grade FROM ranked_grades WHERE grade_rank <= 2;
方法二:不使用窗口函数(兼容旧版SQL)
如果你的SQL环境不支持窗口函数,可以通过嵌套子查询先获取前两名的成绩档次,再筛选符合条件的用户:
SELECT name, MAX(grade) AS max_grade FROM exercise_5 GROUP BY name HAVING MAX(grade) IN ( SELECT DISTINCT max_grade FROM ( SELECT MAX(grade) AS max_grade FROM exercise_5 GROUP BY name ) AS user_grades ORDER BY max_grade DESC LIMIT 2 );
这个逻辑是:先算出每个用户的最高成绩,提取其中不同的成绩值并取前2个最高的,最后把所有最高成绩属于这两个值的用户筛选出来。
内容的提问来源于stack exchange,提问作者Oscar Petersen
相关产品推荐
相关产品推荐

