编写一个SQL查询来实现分数排名。
如果两个学生分数相同,则排名(Rank)相同,请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
ID | Score |
---|---|
1001 | 78 |
1002 | 83 |
1003 | 83 |
1004 | 92 |
1005 | 65 |
1006 | 89 |
上述Student表查询应得的结果:
Score | Rank |
---|---|
92 | 1 |
89 | 2 |
83 | 3 |
83 | 3 |
78 | 4 |
65 | 5 |
MYSQL写法
SELECT *,dense_rank() Over (ORDER BY score DESC) as dense_ranking from Student
区分三个函数:
SELECT *,rank() Over (ORDER BY score DESC) as ranking ,
dense_rank() Over (ORDER BY score DESC) as dense_ranking,
row_number() Over (ORDER BY score DESC) as rownum
from Student
得出的结果如下:
我们可以这么去理解:
1. dense(密集的),dense_rank(密集的排名):
有并列排名的时候下一个排名紧接上一个并列的排名,两个第二名后面是第三名
2. row_number:
可以理解为行的序号,不考虑并列排名
3. rank:
跳跃排序,两个并列的第二名后面就是第四名