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

