题目描述
编写 SQL 查询对分数进行排序。排名按以下规则计算:
- 分数应按从高到低排列。
- 如果两个分数相等,那么两个分数的排名应该相同。
- 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
解题思路
1. 分表查询
- 每个分数的排名
select distinct score
from Scores
order by score desc
- 分数X的排名
select count(score)
from Scores
order by score desc
where score>=X
- 整合两部分
select a.score score,
(select count(distinct b.score) from Scores b where a.score <= b.score) as `rank`
# 注意现在 rank 不加反引号`` 会报错
from Scores a
order by score desc
2. 窗口函数
- 窗口函数使用
函数名([参数]) over(partition by [分组字段] order by [排序字段] asc/desc rows/range
- 窗口函数有关排名的算法
- row_number(): 同薪不同名,相当于行号,例如3000、2000、2000、1000排名后为1、2、3、4
- rank(): 同薪同名,有跳级,例如3000、2000、2000、1000排名后为1、2、2、4
- dense_rank(): 同薪同名,无跳级,例如3000、2000、2000、1000排名后为1、2、2、3