• MySQL四大排名函数


    一、ROW_NUMBER ()

    --语法形式:  ROW_NUMBER()  OVER(PARTITION BY COL1 ORDER BY COL2) 
    --解释:     根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

    举例说明:

    select ROW_NUMBER() over(order by id1) odid,* from #t1

    select ROW_NUMBER() over(partition by id1 order by id1) odid,* from #t1

    常用的使用场景: 取每个学科的前3名

    select * from 
    ( select subject,name,score,ROW_NUMBER() over(PARTITION by subject order by score desc) as num from #score 
    ) T where T.num <= 3 order by subject 

    结果:

     二、RANK()

    定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里得区分和ROW_NUMBER()不一样的地方,ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而使用Rank()时,出现相同成绩时,他们的排名是一样的。
    举例说明row_number()和rank()的区别:

     

    当出现两个学生成绩相同时,ROW_NUMBER()排名不一样,而rank()排名一样。RANK()是 1 2 2,而ROW_NUMBER()则还是1 2 3,这就是RANK()和ROW_NUMBER()的区别了

     此函数也可以使用partition by进行分组

    三、DENSE_RANK()

    定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?看例子:

     DENSE_RANK()密集的排名他和RANK()区别在于,排名的连续性,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,所以一般情况下用的排名函数就是RANK()。

     此函数也可以使用partition by进行分组

    四、NTILE() 

    定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的’分区’一样 ,分为几个区,一个区会有多少个。

     这里查询了3次,第一次分为1个’区’ ,所以查询结果number全是1,第二次分为2个区,查询结果为 1 1 2,意思就是 第一个 ‘区’ 为 1 1 两个编号的数据 ,第二个’区’只有2这个数据。

  • 相关阅读:
    模板
    洛谷
    Codeforces
    Codeforces
    Codeforces
    Codeforces
    洛谷
    洛谷
    洛谷
    NOIP 普及组 2016 海港
  • 原文地址:https://www.cnblogs.com/lyh233/p/16011757.html
Copyright © 2020-2023  润新知