美文网首页
LeetCode数据库—分数排名

LeetCode数据库—分数排名

作者: Taodede | 来源:发表于2018-11-09 19:26 被阅读34次

    SQL架构:

    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');
    

    查看完整表记录

    mysql> select * from scores;
    +------+-------+
    | Id   | Score |
    +------+-------+
    |    1 |  3.50 |
    |    2 |  3.65 |
    |    3 |  4.00 |
    |    4 |  3.85 |
    |    5 |  4.00 |
    |    6 |  3.65 |
    +------+-------+
    6 rows in set (0.00 sec)
    

    编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
    例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

    +-------+------+
    | Score | Rank |
    +-------+------+
    | 4.00  | 1    |
    | 4.00  | 1    |
    | 3.85  | 2    |
    | 3.65  | 3    |
    | 3.65  | 3    |
    | 3.50  | 4    |
    +-------+------+
    

    解法

    mysql> select score,
        -> (select count(distinct score) from scores where score>=s.score) Rank
        -> from scores s
        -> order by score desc;
    +-------+------+
    | score | Rank |
    +-------+------+
    |  4.00 |    1 |
    |  4.00 |    1 |
    |  3.85 |    2 |
    |  3.65 |    3 |
    |  3.65 |    3 |
    |  3.50 |    4 |
    +-------+------+
    6 rows in set (0.00 sec)
    

    这里可以延伸出另外一种排序方法
    如下:
    重复值的排名相同,但计次

    +-------+------+
    | score | rank |
    +-------+------+
    |  4.00 |    1 |
    |  4.00 |    1 |
    |  3.85 |    3 |
    |  3.65 |    4 |
    |  3.65 |    4 |
    |  3.50 |    6 |
    +-------+------+
    

    解法

    mysql> select score,
        -> (select count(score)+1 from scores s1 where s1.score>s2.score)as rank
        -> from scores s2
        -> order by score desc;
    +-------+------+
    | score | rank |
    +-------+------+
    |  4.00 |    1 |
    |  4.00 |    1 |
    |  3.85 |    3 |
    |  3.65 |    4 |
    |  3.65 |    4 |
    |  3.50 |    6 |
    +-------+------+
    6 rows in set (0.00 sec)
    

    相关文章

      网友评论

          本文标题:LeetCode数据库—分数排名

          本文链接:https://www.haomeiwen.com/subject/zgugxqtx.html