解题思路:
1、首先,我们需要对分数进行倒序排序(以下得出的结果是没有去重过的倒序的分数)
select Score from Scores order by Score DESC
2、接下来我们还缺少一列Rank。例如:一个班有20个人,但是所有人都考了95分,那么全班同学都是并列第一即名次只有一个;如果一部分同学考了95,一部分考了90,一部分考了85,那么整个成绩的排名就分为3个名次。(以下得出的结果是去重之后名次的总数)
select count(distinct Score) from Scores
3、最后考虑如何将前面的两者结合起来,并且将各自的名次显示出来。在我们执行第二步的时候,是否可以这么考虑,在对分数进行去重统计总数的基础上,我们再加一个条件,就是统计去重总数的同时我们筛选出来比我们分数高的人的个数(因为这里是去重的统计,所以最终的出来的名次就是该人的真实名次,不会出现比如有两个人是并列第一,而接下来的那个人却是排名第三的这种错误的情况)这里+1的理解是因为条件部分使用的是 > 而不是>=,如果使用的是>=的话就不需要+1操作了,见解法二
(解法一)Select
a.Score as score, (select count(distinct b.Score)+1 from Scores as b where b.Score > a.Score) as Rank
from Scores as a order by a.Score DESC
(解法二)Select
a.Score as score, (select count(distinct b.Score) from Scores as b where b.Score >= a.Score) as Rank
from Scores as a order by a.Score DESC
执行结果图
标签:分数,名次,mysql,Rank,Score,Scores,排名,select