如何获取总分排名第2和第3的学生?SQL语句报错求助
问题分析与解决方案
你的SQL语句报错,核心原因是窗口函数(如RANK())不能直接放在HAVING子句中。HAVING用于过滤分组聚合后的结果,而窗口函数的计算是在分组聚合完成后才执行的,逻辑顺序上不支持在HAVING中用窗口函数做过滤。
另外原语句里ORDER BY SUM(marks)是升序排序,会让总分最低的学生排第1,不符合常规“总分越高排名越靠前”的逻辑,需要加上DESC修正排序方向。
正确写法1:使用CTE(公共表表达式)
WITH StudentTotal AS ( SELECT s.[SID], s.Name, SUM(M.Marks) AS TotalMarks, RANK() OVER (ORDER BY SUM(M.Marks) DESC) AS Rank_ FROM Students S INNER JOIN Marks M ON S.[SID] = M.[SID] GROUP BY s.[SID], s.Name ) SELECT SID, Name, TotalMarks, Rank_ FROM StudentTotal WHERE Rank_ IN (2, 3);
正确写法2:使用子查询
SELECT SID, Name, TotalMarks, Rank_ FROM ( SELECT s.[SID], s.Name, SUM(M.Marks) AS TotalMarks, RANK() OVER (ORDER BY SUM(M.Marks) DESC) AS Rank_ FROM Students S INNER JOIN Marks M ON S.[SID] = M.[SID] GROUP BY s.[SID], s.Name ) AS RankedStudents WHERE Rank_ IN (2, 3);
说明
- 先通过CTE或子查询完成分组聚合,计算每个学生的总分,并基于总分降序生成排名;
- 在外层查询中直接过滤排名为2和3的记录,这符合SQL的执行逻辑顺序。
内容的提问来源于stack exchange,提问作者Abhilash_P
相关产品推荐
相关产品推荐

