RANK 和 DENSE_RANK 函数
本课属于 Coddy SQL 学习旅程的“基础知识”单元。第 65 课,共 72 课。
ROW_NUMBER() 是一种排名函数,还有另外两种:RANK() 和 DENSE_RANK()。
RANK() 函数为行编号,类似于 ROW_NUMBER(),但相同的行会获得相同的编号,并且会跳过编号。DENSE_RANK() 与 RANK() 类似,但不会跳过编号。
例如:
| id | level |
| 1 | 5 |
| 2 | 6 |
| 3 | 6 |
| 4 | 7 |
| 5 | 7 |
| 6 | 5 |
SELECT id,
ROW_NUMBER() OVER (ORDER BY level) as row_num,
RANK() OVER (ORDER BY level) as row_rank,
DENSE_RANK() OVER (ORDER BY level) as row_dense_rank
FROM table1这将返回:
| id | row_num | row_rank | row_dense_rank |
| 1 | 1 | 1 | 1 |
| 6 | 2 | 1 | 1 |
| 2 | 3 | 3 | 2 |
| 3 | 4 | 3 | 2 |
| 4 | 5 | 5 | 3 |
| 5 | 6 | 5 | 3 |
说明:
ROW_NUMBER():始终唯一:1、2、3、4、5、6RANK():- 等级 5(2 行):两行的排名都是 1
- 等级 6(2 行):两行的排名都是 3(跳过 2)
- 等级 7(2 行):两行的排名都是 5(跳过 4)
DENSE_RANK():- 等级 5(2 行):两行的排名都是 1
- 等级 6(2 行):两行的排名都是 2(不跳过)
- 等级 7(2 行):两行的排名都是 3(不跳过)
挑战
简单可用的表和列:
medals:region,medal_color,medal_count
编写一个查询,显示地区、奖牌总数(不考虑颜色,统计所有奖牌的总和)和两种排名:
- 按奖牌总数进行排名的
regular_rank(排名之间有间隔) - 按奖牌总数进行排名的
dense_rank(排名之间没有间隔)
按以下顺序排列结果:
order by total_medals desc, region asc亲手试试
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: SQL 在线编辑器