如果两个分数相同,则两个分数排名(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;