如何在SQL Server中编写查询获取班级第二高平均绩点
SQL Server查询班级第二高平均绩点实现方案
你当前的SQL语句逻辑存在偏差,混淆了薪资和绩点的筛选条件,也无法适配并列最高绩点的场景,以下是不同场景下的正确实现:
方案1:SQL Server 2012及以上版本 OFFSET FETCH 写法
适合仅需要获取第二高绩点数值的场景:
SELECT DISTINCT average AS second_highest_average FROM Course ORDER BY average DESC -- 跳过排名第一的行,取下1行 OFFSET 1 ROW FETCH NEXT 1 ROW ONLY;
方案2:窗口函数写法(支持返回对应班级名称,适配并列排名)
如果存在多个班级绩点相同且均为第二高的情况,该写法会返回所有符合条件的班级:
SELECT name, average FROM ( SELECT name, average, -- 按绩点倒序排名,相同绩点排名一致,不会跳过排名空位 DENSE_RANK() OVER(ORDER BY average DESC) AS rank_num FROM Course ) AS ranked_course WHERE rank_num = 2;
方案3:低版本SQL Server兼容写法
适合2012之前不支持OFFSET和窗口函数的版本:
SELECT MAX(average) AS second_highest_average FROM Course -- 排除最高绩点后取最大值即为第二高 WHERE average < (SELECT MAX(average) FROM Course);
补充说明
- 如果所有班级绩点相同,没有第二高绩点,上述查询会返回空,可在外层套
ISNULL函数自定义返回默认值 - 若不需要保留并列结果,可将
DENSE_RANK替换为ROW_NUMBER,仅返回1条符合条件的结果
内容的提问来源于stack exchange,提问作者Maysam Razzaghi
相关产品推荐
相关产品推荐

