LeetCode#分数排名

302 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

一、题目

表: Scores

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+

Id是该表的主键。 该表的每一行都包含了一场比赛的分数。Score是一个有两位小数点的浮点值。  

编写 SQL 查询对分数进行排序。排名按以下规则计算:

分数应按从高到低排列。 如果两个分数相等,那么两个分数的排名应该相同。 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。 按 score 降序返回结果表。

查询结果格式如下所示。

 

示例 1:

输入: 
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
输出: 
+-------+------+
| score | rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ra… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路

根据题意创建数据库

根据字段类型创建数据表

create table if not exists Scores (
    id int,
    score decimal(3,2)
);
truncate table Scores;
insert into Scores values
('1', '3.5'),
('2', '3.65'),
('3', '4.0'),
('4', '3.85'),
('5', '4.0'),
('6', '3.65');

解题

  • 根据题意,首先要将分数进行排序,这里使用group by进行倒叙排列,同时这是两个假名score和rank
  • 当拿到第一步后,这里要考虑第二部,如何才能得到排序呢
  • 这里首先要将分数进行去重,这里使用distinct,同时提取一个分数,将该分数拿进来对比,有多少个大于等于该分数的值,比如4,拿进来会发现只有一个,那么就是第一名,接下来拿3.85,发现有两个,那么就是2,依次类推
  • 将第一步与第二步相结合就得到了最终的答案。

代码

select a.score score,
       (select count(distinct b.score) from Scores b where b.score >= a.score) 'rank'
from Scores a order by a.score desc;

三、执行结果

运行结果

image.png

四、总结

  • order by: 用于在where之后,给字段排序的查询语句。order by默认升序asc。desc为降序
  • count(distinct): 在该题中起到统计分组去重且不为null的记录。count()是一个聚合函数,返回指定匹配条件的行数。