编写一个 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