• mysql排名函数解析


    一、数据准备

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

      简述:成绩表只有id和成绩两个字段

    二、排名函数分类

      rank()

       作用:   

    按照某字段的排序结果添加排名,但它是跳跃的、间断的排名,例如两个并列第一名后,下一个是第三名

       示例代码:

    SELECT score,rank() over(ORDER BY score desc ) as ranked FROM scores;

       结果:

    +-------+--------+
    | score | ranked |
    +-------+--------+
    | 4     |      1 |
    | 4     |      1 |
    | 3.85  |      3 |
    | 3.65  |      4 |
    | 3.65  |      4 |
    | 3.5   |      6 |
    +-------+--------+
    6 rows in set

      row_number()

       作用:

    它是将某字段按照顺序依次添加行号

       示例代码:

    SELECT score,ROW_number() over(ORDER BY score desc ) as ranked FROM scores;

       结果:

    +-------+--------+
    | score | ranked |
    +-------+--------+
    | 4     |      1 |
    | 4     |      2 |
    | 3.85  |      3 |
    | 3.65  |      4 |
    | 3.65  |      5 |
    | 3.5   |      6 |
    +-------+--------+
    6 rows in set

    备注:

    只是单纯的添加行号,和成绩字段无关联

      dense_rank()

       作用:

    dense 英语中指“稠密的、密集的”。dense_rank()是的排序数字是连续的、不间断。当有相同的分数时,它们的排名结果是并列的,例如,1,2,2,3

       示例代码:

    SELECT score,dense_rank() over(ORDER BY score desc ) as ranked FROM scores;

       结果:

    +-------+--------+
    | score | ranked |
    +-------+--------+
    | 4     |      1 |
    | 4     |      1 |
    | 3.85  |      2 |
    | 3.65  |      3 |
    | 3.65  |      3 |
    | 3.5   |      4 |
    +-------+--------+
    6 rows in set

     三、总结

    函数名 关键词 作用 主要适用场景
    rank() 间断、 不连续 按顺序输出排名结果,每当出现一个并列结果,则下一个排名数字向后递增一位 在并列结果中,每个并列成绩都要占用一个名额的场景
    dense_rank() 连续 按数学输出排名的名次。当出现并列结果时,下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔” 当排序结果存在并列成绩时,需要下一个名次于上一个名次是连续整数的情况。
    row_number() 行号 按顺序输出表的行号 需要输出表的行号时
    知道、想到、做到、得到
  • 相关阅读:
    白盒测试方法
    单元测试 集成测试 系统测试
    快慢指针原理和应用
    实例方法,类方法,静态方法区别
    查找算法
    排序算法整理
    Oracle sql developer 删表时遇到问题unique/primary keys in table referenced by foreign keys
    剑指 Offer 18. 删除链表的节点(简单)
    剑指 Offer 17. 打印从1到最大的n位数(简单)
    Cyberdebut的补题列表
  • 原文地址:https://www.cnblogs.com/Durant0420/p/15303767.html
Copyright © 2020-2023  润新知