想要精通算法和SQL的成长之路 - 分数排名(SQL)
前言
一. 分数排名
原题链接我们先准备一张Scores
表,表结构如下:
编写 SQL
查询对分数进行排序。排名按以下规则计算:
- 分数应按从高到低排列。
- 如果两个分数相等,那么两个分数的排名应该相同。
- 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按score
降序返回结果表。
1.1 计算单个分数的排名
一个人的分数排名,就看有多少个人的分数是比他高的。假设一个人的分数是X
。
select count(*) from Scores where score >= X
由于题目要求:相同分数的人,他们的排名是一样的,因此我们这里要做个去重
select count(DISTINCT(score)) from Scores where score >= X
1.2 整合倒序排序
根据排名从大到小排序,SQL
就很简单:
select score from Scores order by score desc;
结果如下:
可见,这时候我们只要结合1.1节的内容,再添加一列rank
即可。只不过这个时候,可能需要用到临时表,因为我们上面还有个变量X
呢。
首先我们将1.1节的SQL
稍微修改下:
(select count(DISTINCT(a.score)) from Scores a where a.score >= X ) as rank
那么这个X
从哪来,它还是来自于Scores
表中的score
:
select b.score from Scores b order by b.score desc;
X
也就是上面的b.score
,那么将两个SQL
嵌套在一起就是:
SELECT b.score,( SELECT count( DISTINCT ( a.score )) FROM Scores a WHERE a.score >= b.score ) AS rank
FROM
Scores b
ORDER BY
b.score DESC;
备注:Mysql
中有一个名叫rank()
的函数,因此leetcode
里面跑代码的时候可能会出错,在于rank
的别名。可以将其改为:AS ‘rank’
,加个单引号即可。