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

为何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:45:04