订阅更新

分数排名:并列之后名次要连续

SQL 实战 123 题 · 第 4 题 中等 约 2 分钟读完

LeetCode 178 · DENSE_RANK、RANK 与 ROW_NUMBER 的区别

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

这题考三个排名函数的区别。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 是关键字,列别名要用反引号括起来。
刷题进度保存在当前浏览器