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

MySQL多科目成绩表按科目排名异常:指定条件后排名始终为1

问题原因

问题出在SQL的执行顺序:WHERE子句会先于窗口函数执行。原查询里先通过WHERE过滤出了Student_id="155676"且Subject="French"的单行数据,之后RANK()窗口函数只能基于这唯一的一条数据计算排名,结果自然是1,无法参考其他同科目学生的成绩。

解决方案

要得到该学生在French科目中的真实排名,需要先计算所有学生的科目排名,再筛选目标学生。下面提供两种常用写法:

方法1:使用CTE(公共表表达式)

WITH StudentRanks AS (
    SELECT 
        Student_id,
        Subject,
        Total_Overal,
        RANK() OVER (PARTITION BY Subject ORDER BY Total_Overal DESC) as StudentRank
    FROM exams
)
SELECT *
FROM StudentRanks
WHERE Student_id = "155676" AND Subject = "French";

方法2:使用子查询

SELECT *
FROM (
    SELECT 
        Student_id,
        Subject,
        Total_Overal,
        RANK() OVER (PARTITION BY Subject ORDER BY Total_Overal DESC) as StudentRank
    FROM exams
) AS RankedExams
WHERE Student_id = "155676" AND Subject = "French";

这两种写法都是先基于全表数据计算每个学生的科目排名,再通过外层查询筛选出你需要的学生和科目数据,这样得到的StudentRank就是该学生在French科目中的真实排名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:08:10