Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>分数排名
表: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 |
二、思路分析:
-
此题需要计算排名,可以直观的用两张相同的表进行查询、排名
-
第一张表用作排序后的数据进行输出,第二张表用于排名数据的输出
-
对于排名的统计,可以使用两张表关联,统计表1在表2中有多少条数据大于当前数据,例如:只有1条大于当前数据,则排名为1
-
统计排名的同时,为避免重复数据,需要使用distinct关键字,保证相同分数的数据排名是一致的
-
根据表1进行group by,不然只有一条数据
-
最后desc score 倒序输出
三、AC 代码:
SELECT
s1.score,
count( DISTINCT s2.score ) AS rank
FROM
scores AS s1,
scores AS s2
WHERE
s1.score <= s2.score
GROUP BY
s1.id
ORDER BY
s1.score DESC;
复制代码
四、总结:
当一次性解决不了的时候,可以循序渐进式解决,例如以下思路:
- 首先是排序:
SELECT
Score AS Score
FROM
Scores
ORDER BY
Score DESC
复制代码
- 第二部分是确定排名,这一部分比较难,我们可以假定有一个未知数X,那如果要取出大于等于X的数,则是:
SELECT
Score
FROM
Scores
WHERE
Score >= X;
复制代码
- 再考虑重复数据的问题
SELECT
count( DISTINCT Score )
FROM
Scores
WHERE
Score >= X AS Rank;
复制代码
- 最后是结合另一张表,综合起来得出最后答案
SELECT
s1.score,
count( DISTINCT s2.score ) AS rank
FROM
scores AS s1,
scores AS s2
WHERE
s1.score <= s2.score
GROUP BY
s1.id
ORDER BY
s1.score DESC;
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END