編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(rank)相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有「間隔
例如,根據上述給定的 scores 表,你的查詢應該返回(按分數從高到低排列):
例如,根據上述給定的 scores 表,你的查詢應該返回(按分數從高到低排列):
解析:最後的結果包含兩個部分,第一部分是降序排列的分數,第二部分是每個分數對應的排名。
第一部分不難寫:
select a.score as score
from scores a
order
by a.score desc
比較難的是第二部分。假設現在給你乙個分數x,如何算出它的排名rank呢?
我們可以先提取出大於等於x的所有分數集合h,將h去重後的元素個數就是x的排名。比如你考了99分,但最高的就只有99分,那麼去重之後集合h裡就只有99乙個元素,個數為1,因此你的rank為1。
先提取集合h:
select b.score from scores b where b.score >= x;
我們要的是集合h去重之後的元素個數,因此公升級為:
select
count
(distinct b.score)
from scores b where b.score >= x as rank;
而從結果的角度來看,第二部分的rank是對應第一部分的分數來的,所以這裡的x就是上面的a.score,把兩部分結合在一起為:
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 a.score desc
其實該題最後可以通過sqlyog驗證:驗證如下:
菜鳥今日總結:在做演算法推導不明白的時候,可以實際去編譯一下,這樣更好理解!!!
178 分數排名
編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上述給定的 s...
178 分數排名
sql架構 編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上...
178 分數排名
編寫乙個 sql 查詢來實現分數排名。示例 如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上述給定...