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

如何获取总分排名第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);

说明

  1. 先通过CTE或子查询完成分组聚合,计算每个学生的总分,并基于总分降序生成排名;
  2. 在外层查询中直接过滤排名为2和3的记录,这符合SQL的执行逻辑顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:49:57