力扣题目-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 |
答案
官方答案
解法一:
SELECTS.score,DENSE_RANK() OVER (ORDER BYS.score DESC) AS 'rank'
FROMScores S;作者:力扣官方题解
链接:https://leetcode.cn/problems/rank-scores/solutions/2366211/fen-shu-pai-ming-by-leetcode-solution-qekv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解法二
SELECTS1.score,(SELECTCOUNT(DISTINCT S2.score)FROMScores S2WHERES2.score >= S1.score) AS 'rank'
FROMScores S1
ORDER BYS1.score DESC;作者:力扣官方题解
链接:https://leetcode.cn/problems/rank-scores/solutions/2366211/fen-shu-pai-ming-by-leetcode-solution-qekv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解法三:
SELECTS.score,COUNT(DISTINCT T.score) AS 'rank'
FROMScores SINNER JOIN Scores T ON S.score <= T.score
GROUP BYS.id,S.score
ORDER BYS.score DESC;作者:力扣官方题解
链接:https://leetcode.cn/problems/rank-scores/solutions/2366211/fen-shu-pai-ming-by-leetcode-solution-qekv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
其他有意思的答案
SELECTscore,(SELECT count(distinct score) FROM scores WHERE score >= s.score) as 'Rank'
FROM scores s
ORDER BY score desc
我的答案
2024年2月20日
第一次回答
一开始是把score字段给整理好,后面就排序后添加序号列。
SELECTc.score,c.ranka as 'rank'
FROM(SELECTscore,( @rank := @rank + 1 ) AS ranka FROM( SELECT DISTINCT score FROM Scores ORDER BY score DESC ) b,(SELECT@rank := 0 ) as R ) AS cRIGHT JOIN scores ON scores.score = c.scoreorder by scores.score DESC;