力扣题目-178. 分数排名
仅作学习,不作他用
题干
表: Scores
Column Name | Type |
---|---|
id | int |
score | decimal |
在 SQL 中,id 是该表的主键。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。
查询并对分数进行排序。排名按以下规则计算:
分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 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 |
答案
官方答案
解法一:
SELECT
S.score,
DENSE_RANK() OVER (
ORDER BY
S.score DESC
) AS 'rank'
FROM
Scores S;
作者:力扣官方题解
链接:https://leetcode.cn/problems/rank-scores/solutions/2366211/fen-shu-pai-ming-by-leetcode-solution-qekv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解法二
SELECT
S1.score,
(
SELECT
COUNT(DISTINCT S2.score)
FROM
Scores S2
WHERE
S2.score >= S1.score
) AS 'rank'
FROM
Scores S1
ORDER BY
S1.score DESC;
作者:力扣官方题解
链接:https://leetcode.cn/problems/rank-scores/solutions/2366211/fen-shu-pai-ming-by-leetcode-solution-qekv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解法三:
SELECT
S.score,
COUNT(DISTINCT T.score) AS 'rank'
FROM
Scores S
INNER JOIN Scores T ON S.score <= T.score
GROUP BY
S.id,
S.score
ORDER BY
S.score DESC;
作者:力扣官方题解
链接:https://leetcode.cn/problems/rank-scores/solutions/2366211/fen-shu-pai-ming-by-leetcode-solution-qekv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
其他有意思的答案
SELECT
score,
(SELECT count(distinct score) FROM scores WHERE score >= s.score) as 'Rank'
FROM scores s
ORDER BY score desc
我的答案
2024年2月20日
第一次回答
一开始是把score字段给整理好,后面就排序后添加序号列。
SELECT
c.score,
c.ranka as 'rank'
FROM
(
SELECT
score,
( @rank := @rank + 1 ) AS ranka
FROM
( SELECT DISTINCT score FROM Scores ORDER BY score DESC ) b,(
SELECT
@rank := 0
) as R
) AS c
RIGHT JOIN scores ON scores.score = c.score
order by scores.score DESC;