SQL:
select s1.score,
(select count(distinct s2.score)
from scores s2
where s2.score >= s1.score) as 'rank'
from scores s1
order by s1.score desc
描述:
表: Scores
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | score | decimal | +-------------+---------+ id 是该表的主键(有不同值的列)。 该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。
编写一个解决方案来查询分数的排名。排名按以下规则计算:
- 分数应按从高到低排列。
- 如果两个分数相等,那么两个分数的排名应该相同。
- 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score
降序返回结果表。
示例:
输入: Scores 表: +----+-------+ | id | score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+ 输出: +-------+------+ | score | rank | +-------+------+ | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.50 | 4 | +-------+------+
分析:
这道题其实就是对分数的排名进行一个查询,而且并无排名跳跃的情况,即若两人并列第一,则第三个人排名为第二而不是第三,对于这种情况就需要用去重的查询,可以用第二张表与第一张表的分数进行对比,若大于等于第一张表的分数有1个,就说明只有他本身这个分数即第一名,若大于等于的有两个,说明有一个分数比他大,另一个分数就是他本身,所以他是第二名,由此得出查询排名的SQL:
(select count(distinct s2.score)
from scores s2
where s2.score >= s1.score) as 'rank'
最后再对分数做降序处理即可:
select s1.score,
(select count(distinct s2.score)
from scores s2
where s2.score >= s1.score) as 'rank'
from scores s1
order by s1.score desc