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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:32:26