最近在學習sql語句,主要使用mysql,在力扣上打卡解題,記錄一下大神們的解法。
題目
編寫乙個sql查詢來實現分數排名。
如果兩個分數相同,則兩個分數排名(rank)相同,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有「間隔」。
例如,根據上述給定的scores表,你的查詢應該返回(按分數從高到低排列):
**題解(總結了大神們的)**以下
總結來自「猴子」:《經典排名問題》
以班級種學生的成績為例,查詢學生的排名問題。
「班級表」中的內容如下,記錄了每個學生所在的班級和對應的成績。
現在按照成績來排名,依據題意,成績相同的學生排名是並列的。比如:正常的排名是1,2,3,4,但是現在前3名成績相同,則排名結果應該是1,1,1,2。
【解題思路】
1、涉及到排名問題,可以使用視窗函式
2、專用視窗函式rank,dense_rank,row_number在用法上的區別?
針對問題二,用乙個例子可以直觀表達:
select*,
rank(
)over
(order
by 成績 desc
)as ranking,
dense_rank(
)over
(order
by 成績 desc
)as dese_rank,
row_rank(
)over
(order
by 成績 desc
)as row_num
from 班級表
得到結果:
從結果中可以看到三者的區別:
1)rank函式:出現並列的話會占用下一名次的位置,即正常排名是1,2,3,4,如果前三名並列,結果為1,1,1,4
3)row_number函式:不考慮名次並列的情況。即正常排名是1,2,3,4,如果前三名並列,結果仍為1,2,3,4
select score,
dense_rank(
)over
(order
by score desc)as
'rank'
from scores;
【本題考點】
1、考察如何使用視窗函式
2、專用視窗函式排名的區別:rank, dense_rank, row_number
關於視窗函式的用法,可以參看猴子的這篇文章《通俗易懂的學會:sql視窗函式》:
《通俗易懂的學會:sql視窗函式》
LeetCode力扣刷題資料庫(178) 分數排名
編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 例如,根據上述給定的 scores 表,你的查詢應該返回 按分數從高到低排列 將選擇出來的命名為a select a.scor...
LeetCode資料庫 178 分數排名
編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上述給定的 s...
leetcode 資料庫 178 分數排名
題目 編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上述給定...