持续创作,加速成长!这是我参与「掘金日新计划 · 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;
三、执行结果
运行结果
四、总结
- order by: 用于在where之后,给字段排序的查询语句。order by默认升序asc。desc为降序
- count(distinct): 在该题中起到统计分组去重且不为null的记录。count()是一个聚合函数,返回指定匹配条件的行数。