編寫一個 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    |
+-------+------+
來源:力扣(LeetCode)
鏈接: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;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM