
1. 窗口函数 DENSE_RANK() ✅
这是解决本题的最直接方法,完全匹配题目要求:
-
语法 :
DENSE_RANK() OVER (ORDER BY score DESC) -
特性:
- 分数相同则排名相同(如两个
4.00都排第 1) - 并列后排名不会跳过数字(如第 1 名之后直接是第 2 名)
- 分数相同则排名相同(如两个
-
示例代码:
sql
sqlSELECT score, DENSE_RANK() OVER (ORDER BY score DESC) AS `rank` FROM Scores;
2. 窗口函数 RANK() 与 ROW_NUMBER() 的对比
表格
| 函数名 | 排名规则 | 示例结果(分数 4.00,4.00,3.85) |
|---|---|---|
DENSE_RANK() |
并列排名,排名连续 | 1, 1, 2 |
RANK() |
并列排名,排名会跳过(有空隙) | 1, 1, 3 |
ROW_NUMBER() |
即使分数相同,也会分配连续序号 | 1, 2, 3 |
本题必须用
DENSE_RANK(),因为RANK()会产生排名空隙,ROW_NUMBER()无法实现并列。
3. 子查询 / 自连接实现排名(传统方法)
如果不支持窗口函数,可以用自连接 模拟 DENSE_RANK():
sql
sql
SELECT
s1.score,
(SELECT COUNT(DISTINCT s2.score)
FROM Scores s2
WHERE s2.score >= s1.score) AS `rank`
FROM Scores s1
ORDER BY s1.score DESC;
- 逻辑:对每个分数
s1.score,统计有多少个不重复且大于等于它的分数,这个数量就是它的排名。 - 优点:兼容所有 SQL 版本
- 缺点:性能比窗口函数差,大数据量下效率低
4. 关键字与别名注意事项
rank是 SQL 关键字,在 MySQL 中需要用反引号rank包裹作为列名,避免语法冲突。- 排序必须用
ORDER BY score DESC,保证结果按分数从高到低排列。
💡 易错点提醒
- ❌ 使用
RANK():会导致排名出现空隙(如两个第 1 名后直接是第 3 名),不符合题目要求。 - ❌ 使用
ROW_NUMBER():无法实现并列排名,相同分数会被分配不同序号。 - ❌ 忘记给
rank加反引号:在 MySQL 中会报语法错误,因为rank是保留字。 - ✅ 优先使用
DENSE_RANK()窗口函数,简洁且性能最优。
📌 总结
这道题的本质是理解 「并列且连续」的排名规则,核心知识点是:
- 窗口函数
DENSE_RANK():专门用于实现「并列排名且连续」的场景,是本题最优解。 - 不同排名函数的区别 :
DENSE_RANK()、RANK()、ROW_NUMBER()的行为差异是面试高频考点。 - 传统自连接方法:在不支持窗口函数的环境下,通过子查询统计不重复分数来实现排名。