排序问题是sql中一个常见的问题,若遇到不仅让某字段排序,并且生产一个排名列,该如何设计呢?
现有表如下:
要求输出一个按照score降序的排名结果,排名列为新列,且相同分数为同一名次,且保证排名连续。
我们先分析一下,如何才会产生排名。这可以理解为比他大的分数有几个,或者他大于的分数有几个。若按照升序方式排列即1,2,3...那么就得看大于他的有几个,那么初步思路已经有了,就是寻找比他大的得分有几个。
比较需要两列数据,像这种对自身数据进行比较可以生成多个重复表进行不同命名的形式,然后进行非等值连接(因为是比较,肯定是非等值)
对比较结果进行计数,来得出排名。如果大于某得分的有1个那么该id应该排名第二,所以要大于等于才能获取数据为2。并且要求相同分数排名一致,所以还得对取得的对应数据进行去重。
select a.score,count(distinct b.score) 'rank'
from Score a , Score b
where a.score <= b.socre
group by a.score
order by a.score
为什么要加上group by ?如果不加上group by 就会输出一个记录,加上之后会对id进行分组查询,才能得到正确结果,但是为什么不加会只有一个输出呢,为什么只提取一个数据后就停止了?强行解释就是他需要对不同类别进行处理,但是题目要求相同的数据排名一样,所以不能对score进行分组