zoukankan      html  css  js  c++  java
  • 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() 行号 按顺序输出表的行号 需要输出表的行号时
    知道、想到、做到、得到
  • 相关阅读:
    这篇是Mark刚写的文档,原文为http://blogs.technet.com/markrussinovich/archive/2009/11/03/3291024.aspx
    自动加域批处理脚本[转]
    一次moveuser的使用经历[转]
    How to create fully custom Role, User, Event, Resource classes for use with the Security and Scheduler modules
    VBS脚本批处理创建域用户【可自动设置用户密码,创建OU】[转]
    eXpress App Framework Team
    客户端【脚本】自动加入域[转]
    XAF 如何控制自定义按钮的使用权限[转]
    How to make crossthread calls. (多线程操控窗体控件之不可行)
    改变TFS本地映射路径.
  • 原文地址:https://www.cnblogs.com/Durant0420/p/15303767.html
Copyright © 2011-2022 走看看