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

如何用SQL按STUDENT-CLASS组合取MAX(SCORE)并去重?

解决SQL分组取最大值并去重的问题

你用窗口函数MAX(SCORE) OVER (PARTITION BY STUDENT, CLASS)时,窗口函数会给分组内的每一行都返回最大值,导致同一学生-班级组合下出现重复行。以下几种方法可以解决这个问题:

方法1:使用GROUP BY聚合(最直接)

通过GROUP BY按学生和班级分组,配合聚合函数直接得到每个分组的唯一最大值行:

SELECT STUDENT, CLASS, MAX(SCORE) AS SCORE
FROM TABLE1
GROUP BY STUDENT, CLASS
ORDER BY STUDENT, CLASS;

这是最贴合需求的常规写法,GROUP BY会自动合并相同学生-班级的行,MAX(SCORE)计算每组最高分,天然保证每个分组仅返回一行。

方法2:窗口函数配合DISTINCT去重

如果一定要用窗口函数,可以通过DISTINCT过滤重复的结果行:

SELECT DISTINCT STUDENT, CLASS, MAX(SCORE) OVER (PARTITION BY STUDENT, CLASS) AS SCORE
FROM TABLE1
ORDER BY STUDENT, CLASS;

同一分组内窗口函数返回的最大值完全相同,DISTINCT会移除所有重复记录,最终每个分组只保留一行最大值。

方法3:用ROW_NUMBER()筛选唯一行

通过ROW_NUMBER()给每个分组内的行按分数降序编号,筛选编号为1的行(即最高分所在行):

WITH ranked_scores AS (
    SELECT 
        STUDENT, 
        CLASS, 
        SCORE,
        ROW_NUMBER() OVER (PARTITION BY STUDENT, CLASS ORDER BY SCORE DESC) AS rn
    FROM TABLE1
)
SELECT STUDENT, CLASS, SCORE
FROM ranked_scores
WHERE rn = 1
ORDER BY STUDENT, CLASS;

这种方法适合有更复杂筛选逻辑的场景,即使分组内有多个相同最高分的行,也只会保留其中一行。

内容的提问来源于stack exchange,提问作者bvowe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:58:29