分数排名:并列之后名次要连续
LeetCode 178 · DENSE_RANK、RANK 与 ROW_NUMBER 的区别
面试怎么回答
这题考三个排名函数的区别。ROW_NUMBER 唯一编号,RANK 并列后跳号,DENSE_RANK 并列后连续。题目要求并列后名次连续,所以用 DENSE_RANK() OVER (ORDER BY Score DESC)。如果是不支持窗口函数的老版本,可以用「比当前分数高的不同分数个数 + 1」的相关子查询来算。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
给每个分数排名,分数相同的名次相同,并列之后的下一个名次紧接着加一(不跳号),结果按分数从高到低输出。
表结构
- Scores:Id(主键)、Score
思路
三种排名函数的差别正好是这道题的考点:ROW_NUMBER 不管是否并列都连续编号;RANK 并列同名次,但后面会跳号(1,1,3);DENSE_RANK 并列同名次且不跳号(1,1,2)。题目要求的是 DENSE_RANK。
参考解法
select Score,
dense_rank() over(order by Score desc) `rank`
from Scores
易错点
- 用了 RANK,并列后名次会跳号。
- 在 MySQL 8 里 RANK 是关键字,列别名要用反引号括起来。