MySQL-08练习:分数排名
题目
假设在某次期末考试中,二年级四个班的平均成绩分别是 93、93、93、91,请问可以实现几种排名结果?分别使用了什么函数?排序结果是怎样的?(只考虑降序)
+-------+-----------+
| class | score_avg |
+-------+-----------+
| 1 | 93 |
| 2 | 93 |
| 3 | 93 |
| 4 | 91 |
+-------+-----------+
解答
会有三种排序结果。
- 使用
ROW_NUMBER()
进行排序
ROW_NUMBER()
排序的序号是连续不重复的,即使表中存在多个一样的数值仍然按顺序依次编号。
SELECT score_avg,
ROW_NUMBER() OVER(ORDER BY score_avg DESC) AS 'rank'
FROM Scores;
+------------+------+
| score_avg | rank |
+------------+------+
| 93 | 1 |
| 93 | 2 |
| 93 | 3 |
| 91 | 4 |
+------------+------+
- 使用
rank()
进行排序
rank()
在排序时,会把多个数值相同的归为一组,以同样的序号进行编号。但是编号不连续,会按照实际次序编辑下一组序号。
SELECT score_avg,
rank() OVER(ORDER BY score_avg DESC) AS 'rank'
FROM Scores;
+------------+------+
| score_avg | rank |
+------------+------+
| 93 | 1 |
| 93 | 1 |
| 93 | 1 |
| 91 | 4 |
+------------+------+
- 使用
dense_rank()
进行排序
dense_rank()
在排序时,会把多个数值相同的归为一组,以同样的序号进行编号。但是他编号是连续的。
SELECT score_avg,
dense_rank() OVER(ORDER BY score_avg DESC) AS 'rank'
FROM Scores;
+------------+------+
| score_avg | rank |
+------------+------+
| 93 | 1 |
| 93 | 1 |
| 93 | 1 |
| 91 | 2 |
+------------+------+
- 使用
ntile()
进行排序
ntile(num)
会讲所有的记录分成num
个组,每个组序号一样。但是编号连续。
SELECT score_avg,
ntile(2) OVER(ORDER BY score_avg DESC) AS 'rank'
FROM Scores;
+------------+------+
| score_avg | rank |
+------------+------+
| 93 | 1 |
| 93 | 1 |
| 93 | 1 |
| 91 | 2 |
+------------+------+