欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

178. 分数排名

程序员文章站 2022-03-13 22:06:44
...

编写一个 SQL 查询来实现分数排名。

如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

±—±------+
| Id | Score |
±—±------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
±—±------+

例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

±------±-----+
| Score | Rank |
±------±-----+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
±------±-----+

重要提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 Rank

【解题思路】

  1. 涉及到排名问题,可以使用窗口函数
  2. 专用窗口函数rank, dense_rank, row_number有什么区别呢?

它们的区别我举个例子,你们一下就能看懂:

下图是"班级"表中的内容,记录了每个学生所在班级,和对应的成绩。
178. 分数排名
现在需要按成绩来排名,如果两个分数相同,那么排名要是并列的。

#MySQL
select *,
   rank() over (order by 成绩 desc) as ranking,
   dense_rank() over (order by 成绩 desc) as dese_rank,
   row_number() over (order by 成绩 desc) as row_num
from 班级表
;

结果
178. 分数排名

本题参考答案

#MySQL
select score, 
       dense_rank() over(order by Score desc) as Ranking
from Scores;

注意,mysql版本8以及更高版本才支持窗口函数这个功能;有关于窗口函数的介绍,请关注上一篇

来源:力扣(LeetCode)

相关标签: 数据库 mysql