题目说明
SQL架构
1 2 3 4 5 6 7 8
| Create table If Not Exists Scores (id int, score DECIMAL(3,2)) Truncate table Scores insert into Scores (id, score) values ('1', '3.5') insert into Scores (id, score) values ('2', '3.65') insert into Scores (id, score) values ('3', '4.0') insert into Scores (id, score) values ('4', '3.85') insert into Scores (id, score) values ('5', '4.0') insert into Scores (id, score) values ('6', '3.65')
|
编写一个 SQL 查询来实现分数排名。
如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
1 2 3 4 5 6 7 8 9 10
| +----+-------+ | Id | Score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+
|
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
1 2 3 4 5 6 7 8 9 10
| +-------+------+ | Score | Rank | +-------+------+ | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.50 | 4 | +-------+------+
|
重要提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 Rank
笔者理解
此题是一道SQL算法问题,在力扣题库中被定义为中等题。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # Write your MySQL query statement below
# 解法一 select Score,( # 查询在当前成绩之前的成绩等级有几个 select count(distinct Score) from Scores # 此处用大于等于方便直接以 1 开始排名 where Score >= s.Score ) as `Rank` from Scores s # 再按照成绩进行降序排序 order by Score desc;
# 解法二 # MySQL 8 支持 DENSE_RANK并列连续排序 # 并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,依然按照连续数字排名。 select Score, dense_rank() over( order by Score desc ) as `Rank` from Scores;
|
解法一效率:

解法二效率:

总结
本题是今天的一题,难度是为中等,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。