MYSQL -- 分数排名
原题:
- 分数排名
中等
1.1K
相关企业
SQL Schema
表: Scores
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| score | decimal |
+-------------+---------+
Id是该表的主键。
该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。
编写 SQL 查询对分数进行排序。排名按以下规则计算:
分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score 降序返回结果表。
查询结果格式如下所示。
示例 1:
输入:
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
输出:
+-------+------+
| score | rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
解析:
- 将同一张表引两次,第一张表根据score成绩降序排序,第二张表与第一张表进行比较,COUNT出去重后,大于等于第一张表score的数量,即为该成绩的排名rank
上代码
SELECT s1.score,COUNT(DISTINCT s2.score) as 'rank'
FROM Scores s1,Scores s2
WHERE s1.score<=s2.score
GROUP BY s1.id
ORDER BY s1.score DESC
- MYSQL8.0之后更新了序号函数,该题可直接使用该函数解答
代码:
SELECT Score ,DENSE_RANK() OVER(ORDER BY Score DESC) as 'rank'
FROM Scores
一步搞定,封装过就是舒服
学习地址: MySQL窗口函教-序号函数(row_number、rank、dense_rank)