MySQL:特定类别下每位学生前2项成绩之和的实现问题
解决每个学生前2项成绩求和的SQL问题
嘿,我一眼就看出你原SQL的问题啦!你子查询里的LIMIT 2是从所有符合条件的记录里直接取前2条,而不是给每个学生单独取前2项高分成绩,这就是为什么只返回2个学生,而且求和结果完全不对的原因。
正确解法:用窗口函数分组取前N项
我们可以用窗口函数ROW_NUMBER()(或者RANK()/DENSE_RANK(),看你对并列成绩的处理需求)给每个学生的成绩按分数降序排名,筛选出排名前2的记录后再求和。
最终SQL代码
SELECT stdid, SUM(marks) AS totalmarks FROM ( -- 第一步:给每个学生的成绩按分数降序标排名 SELECT marks, stdid, ROW_NUMBER() OVER (PARTITION BY stdid ORDER BY marks DESC) AS rn FROM finalresult WHERE subjectcategory = 1 AND classId='3' AND year='2018' AND term='2' AND type='23' ) t1 -- 只保留每个学生的前2项高分 WHERE rn <= 2 GROUP BY stdid
关于并列成绩的补充说明
- 如果你的业务允许并列成绩都计入前2(比如某学生有两个相同的最高分,想把这两个都算进去),可以把
ROW_NUMBER()换成RANK():RANK()会给并列的成绩相同的排名,比如两个最高分都是1,下一个成绩是3
- 如果想让并列成绩不占用排名名额,用
DENSE_RANK():DENSE_RANK()给并列成绩相同排名,下一个成绩是2
这样修改后,就能正确计算每个学生特定类别下前2项成绩的总和啦!
内容的提问来源于stack exchange,提问作者DUNCAN OSUR
相关产品推荐
相关产品推荐

