题目难度
中等
题目描述
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
正确答案
SELECT a.score AS Score,
COUNT(DISTINCT b.score) AS Rank
FROM scores a JOIN scores b
WHERE b.score >= a.score
GROUP BY a.id
ORDER BY a.score DESC;
分析
- 两个表自连接(笛卡儿积)
- 选出分数>=我的人,当作我的排名
- 以学生id分组,将每个人看成一组,count大于等于自己的人数
比如:有两个人比我成绩高,加上我的成绩正好三个人,我排第三。这里前两个成绩必须不同,所以在count成绩的时候加了distinct去重。