Create table If Not Exists Scores
(Id
int, Score
DECIMAL(3,2))
Truncate table Scores
insert into Scores
(Id
, Score
) values ('1', '3.5')
insert into Scores
(Id
, Score
) values ('2', '3.65')
insert into Scores
(Id
, Score
) values ('3', '4.0')
insert into Scores
(Id
, Score
) values ('4', '3.85')
insert into Scores
(Id
, Score
) values ('5', '4.0')
insert into Scores
(Id
, Score
) values ('6', '3.65')
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
±—±------+ | Id | Score | ±—±------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | ±—±------+
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
±------±-----+ | Score | Rank | ±------±-----+ | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.50 | 4 | ±------±-----+
解题:
排名的值其实就等于比当前行大或者相当的数量(去重后)
计算比当前行大或者相当的数量(去重后)的方法:
SELECT count(DISTINCT score
)
FROM Scores
WHERE score
>= s
.score
答案:
SELECT Score
, (SELECT count(DISTINCT score
) FROM Scores
WHERE score
>= s
.score
) AS Rank
FROM Scores s
ORDER BY Score
DESC ;