为何使用DENSE_RANK()的SQL成绩排名方案被判定为错误?
为什么DENSE_RANK()方案被判定错误?
问题背景
给定如下Scores表:
+----+-------+ | Id | Score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+
需求是实现分数相同则排名相同、排名无间隔的成绩排名,且结果按分数降序排列。
使用DENSE_RANK()窗口函数编写的查询如下:
SELECT score, DENSE_RANK() OVER(ORDER BY score DESC) AS rank FROM scores;
该查询逻辑上能得到预期结果,却被判定错误。推荐的正确方案是使用子查询统计不同分数的方式:
SELECT s1.Score, ( SELECT COUNT(DISTINCT Score) FROM Scores S2 WHERE S1.Score <= S2.Score ) AS "RANK" FROM Scores s1 ORDER BY s1.Score DESC;
可能的原因分析
- SQL版本兼容性限制:
DENSE_RANK()属于SQL:2003标准引入的窗口函数,部分老旧数据库系统(如MySQL 8.0以前的版本)不支持该特性。而子查询的写法是通用兼容方案,能在几乎所有SQL数据库中运行。如果判题环境使用的是不支持窗口函数的数据库版本,你的方案会因语法错误被判定失败。 - 关键字命名冲突:
rank是多数数据库的保留关键字(如MySQL、PostgreSQL),直接用AS rank作为列别名可能触发语法错误。推荐方案用双引号包裹"RANK",规避了关键字冲突。你可以尝试将别名改为AS ranking或用双引号包裹"rank"后重新测试。 - 输出格式严格校验:部分判题系统会严格校验输出的列名格式,比如要求列名必须是全大写的
RANK,而你的查询输出的列名是小写的rank,这会导致匹配失败。 - 结果集排序问题:窗口函数的
ORDER BY仅用于计算排名,不会影响最终结果集的输出顺序。如果你的查询没有显式添加ORDER BY score DESC子句,实际返回的结果可能未按分数降序排列,不符合需求中的输出要求。
内容的提问来源于stack exchange,提问作者Prathamesh Sawant
相关产品推荐
相关产品推荐

