如何用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
相关产品推荐
相关产品推荐

