分数排名

    科技2026-08-23  3

    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 ;
    Processed: 0.012, SQL: 9