編寫乙個 sql 查詢來實現分數排名。
如果兩個分數相同,則兩個分數排名(rank)相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有「間隔」。+--
--+-------
+| id | score |+--
--+-------
+|1|
3.50||
2|3.65||
3|4.00||
4|3.85||
5|4.00||
6|3.65|+
----+--
----
-+
一、函式
以上函式需與over()搭配使用。
select score, dense_rank(
)over
(order
by score desc)as
'rank'
#因為rank為關鍵字,必須使用『』
from scores
二、採用內部變數
select score, cast(
case
when
@p= score then@r+
0when
@p := score then
@r :=@r+
1else
@r :=@r+
1end
as signed)
as'rank'
from scores,
(select
@r :=0,
@p:=
null
) init
order
by score desc
因為賦值預設為字串,再後面+0轉換型別,轉換成了浮點數,使用cast轉換為整數。
對於所有不滿足@p = score的記錄,將其r+1,且將新的score賦值給@p。在**score不為0的情況下,@pre := score為真;但是在score等於0的情況下,case語句不走任何分支,返回null,**此時@p:= score語句已經執行,後半段@r := @r + 1沒有執行,所以,再加一行else @r := @r + 1。
三、單個比較
每個分數都在表b中找比它高的分數,得出當前分數的排名。
select a.score,
(select
count
(distinct b.score)
from scores as b where b.score >= a.score)
as'rank'
from scores as a
order
by score desc
SQL leetcode178 分數排名
編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上述給定的sc...
178 分數排名
編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 例如,根據上述給定的 scores 表,你的查詢應該返回 按分數從高到低排列 例如,根據上述給定的 scores 表,你的查詢...
178 分數排名
編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上述給定的 s...