如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分后的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。
+----+-------+
| Id | Score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
| 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 |
+-------+------+
| Score | Rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/rank-scores
鏈接:https://leetcode-cn.com/problems/rank-scores
解題
select Score,(dense_rank() over(order by Score desc)) as "Rank" from Scores
#個人小問題,由於不太熟,以至於括號沒加上,一直運行出錯,不能像select table_column as 'new_name'一樣取別名
引申:
mysql可以利用窗口函數實現排名
ROW_NUMBER()
DENSE_RANK()
RANK()
select table_column, rank() over(partition by table_column_ order by column) from table
注意使用區別:
1.rank() over:排名相同的兩名是並列,下一位同學空出所占的名次。
select name,subject,score,rank() over(partition by subject order by score desc) rankfrom student_score;
2.dense_rank() over:與rank() over的區別是,並列下一位同學並不空出所占的名次,(假如班上有三個人,兩個人的成績一樣高於第三個人,那門排名情況為,【1,2】,沒有3)
select name,subject,score,dense_rank() over(partition by subject order by score desc) from student_score;
3.row_number() over這個函數不需要考慮是否並列,哪怕根據條件查詢出來的數值相同也會進行連續排名
select name,subject,score,row_number() over(partition by subject order by score desc) from student_score;