• Sql--排名思路解析及优化


    编写一个 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 |
    +-------+------+
    重要提示:对于 MySQL 解决方案,如果要转义用作列名的保留字,可以在关键字之前和之后使用撇号。例如 `Rank`

    思路分析:

    1、排名很好确定直接查询然后desc即可

    2、添加Rank,举个例子:如果你考试得了90分 找出比你分数高或者分数相同的所有人的个数(100,99,98……一定要去重)有n个 那么你的排名就是n

    select 
    a.Score,
    (select COUNT(DISTINCT b.Score)
    FROM
    Scores b where b.Score >= a.Score) `Rank`
    from Scores a
    ORDER BY a.Score DESC

    优化:

    使用上述 where太慢了需要每个都去对比,使用内连接

    优化方案如下:

    select a.Score as Score,count(distinct b.score) as Rank
    from Scores as a
    inner join Scores as b
    on a.Score>=b.Score
    group by a.id
    order by Score desc;
  • 相关阅读:
    函数
    registry搭建及镜像管理-harbor
    用户输入和while 循环
    dockerfile
    字典,set
    if 语句
    alpine操作
    循环:列表,元组
    列表
    docker跨主机通信-overlay
  • 原文地址:https://www.cnblogs.com/atBruce/p/13128493.html
Copyright © 2020-2023  润新知