原题描述
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
1 | +----+-------+ |
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
1 | +-------+------+ |
题意看起来还是比较容易理解的,答案的核心也就是对sql的查询结果添加序号列。
解答
1 | SELECT s.Score,t.Rank |
这个是利用子查询对每个Socre排序再回过来做一次关联。
More
下面是评论里别人写的几种比较惊奇的思路:
第一种:
1 | SELECT Score, (SELECT COUNT(DISTINCT score) FROM Scores WHERE score >= s.score) AS Rank |
第二种:
1 | SELECT a.Score, SUM(CASE WHEN b.Score >= a.Score THEN 1 END ) AS Rank |
第三种:
1 | SELECT Score, (SELECT COUNT(DISTINCT s.Score) + 1 FROM Scores AS s WHERE s.Score > Scores.Score) AS Rank |