鏈接:https://leetcode-cn.com/problems/rank-scores
編寫一個(gè) SQL 查詢來實(shí)現(xiàn)分?jǐn)?shù)排名吕漂。如果兩個(gè)分?jǐn)?shù)相同蚓哩,則兩個(gè)分?jǐn)?shù)排名(Rank)相同。請注意件已,平分后的下一個(gè)名次應(yīng)該是下一個(gè)連續(xù)的整數(shù)值笋额。換句話說,名次之間不應(yīng)該有“間隔”篷扩。
+----+-------+
| Id | Score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
例如兄猩,根據(jù)上述給定的 Scores 表,你的查詢應(yīng)該返回(按分?jǐn)?shù)從高到低排列):
+-------+------+
| Score | Rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
題解一:
select a.Score,
count(distinct b.Score) as Rank --- 對Score去重計(jì)數(shù)枢冤,當(dāng)做排名
from Scores a, Scores b
where b.Score>=a.Score --- b表中有x個(gè)非重復(fù)值大于等于a表當(dāng)前值鸠姨,則a表當(dāng)前值排名為x
group by a.id --- 為了讓Score全部顯示出來,避免只顯示去重的Score
order by a.Score DESC
;
關(guān)鍵點(diǎn):
- group by a.id 如果去掉的話淹真,會缺數(shù)據(jù)
題解二:
select
a.Score as Score ,
(select count(distinct b.Score) from Scores b where b.Score >=a.Score) as rank
from Scores a
order by Score DESC;
關(guān)鍵點(diǎn):
使用子查詢結(jié)果作為列結(jié)果讶迁,兩層嵌套循環(huán),簡單粗暴核蘸。