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

如何获取数据表中成绩排名前二的记录(含并列情况)

解决方案

要实现找出成绩最高的两位人员(含并列情况),可以用以下两种常用方法:

方法一:使用窗口函数(推荐,简洁直观)

利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:25:23