題目:
編寫乙個 sql 查詢來實現分數排名。
如果兩個分數相同,則兩個分數排名(rank)相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有「間隔」。
±—±------+
| id | score |
±—±------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
±—±------+
例如,根據上述給定的 scores 表,你的查詢應該返回(按分數從高到低排列):
±------±-----+
| score | rank |
±------±-----+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
±------±-----+
解決:
select
s1.score,
( select
count
(distinct score)+1
from
scores s2
where
s2.score > s1.score
)as`rank`
from
scores s1
order by `rank`
解題思路:
利用子查詢查出大於當前成績的個數+1就是排名數,由於同分數同名次,所以distinct去除重複成績。
select
count
(distinct score)+1
from
scores s2
where
s2.score > s1.score
總結:
利用子查詢查詢每個成績的排名;
mysql自動排序函式dense_rank() over(),rank() over(),row_num() over()。
select
score,
dense_rank()
over
(order by score desc)
as`rank`
from scores;
mysql 分數排名
表table1 欄位1 chengji 成績 欄位2 paiming 排名 50 0 80 0 70 0 20 0 90 0 如何用1條mysql查詢語句,執行後讓他們變成 欄位1 chengji 成績 欄位2 paiming 排名 50 4 80 2 70 3 20 5 90 1 solution...
MYSQL分數排名
編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 例如,根據上述給定的 s...
MySQL分數排名問題
今天在做leetcode的mysql題中遇到了一道題。編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 id score 1 3.50 2 3.65 3 4.00 4 3.85...