加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

RANK、DENSE_RANK以及ROW_NUMBER区别

发布时间:2020-12-12 14:03:14 所属栏目:百科 来源:网络整理
导读:场景 数据库查询中,很多时候都会遇到对数据进行分组,然后组内排序加序号的需求。 应用 对于组内排序一般有三个函数可供使用,它们是RANK()、DENSE_RANK()以及ROW_NUMBER()。它们都是对分过组的数据排序加序号,不过又有各自的区别。 语法 它们的语法是一样

场景

数据库查询中,很多时候都会遇到对数据进行分组,然后组内排序加序号的需求。
应用
对于组内排序一般有三个函数可供使用,它们是RANK()、DENSE_RANK()以及ROW_NUMBER()。它们都是对分过组的数据排序加序号,不过又有各自的区别。

语法

它们的语法是一样的,如下:

[sql] view plain copy
  1. ROW_NUMBER()OVER([PARTITIONBYcol1]ORDERBYcol2)
  2. DENSE_RANK()OVER([PARTITIONBYcol2)
  3. RANK()OVER([PARTITIONBYcol2)
其中[PARTITION BY col1]是可选的,即不分组,或者说所有满足条件的数据一组。
区别 三个函数都是按照col1分组内从1开始排序
其中,ROW_NUMBER() 是没有重复值的排序(即使两条记录相同,序号也不重复的),不会有同名次。
DENSE_RANK() 是连续的排序,两个第二名仍然跟着第三名。
RANK() 是跳跃排序,两个第二名下来就是第四名。

使用 下面用一个例子代码来说明一下区别。在例子中我们对员工工资按部门分组进行排序。注意rank的序号变化。

WITHworkersAS(

  • SELECT'DOM1'dept,'zhangsan'names,23age,4000salariesFROMdualUNIONALL
  • 'lisi'names,35age,9000salariesUNIONALL
  • 'zhangchen'names,255);background-color:inherit;">'qiansi'names,255);background-color:inherit;">'DOM2'dept,255);background-color:inherit;">'wangwu'names,26age,6500salaries'maliu'names,28age,6000salaries'zhaoqi'names,5000salaries'liba'names,3000salariesFROMdual
  • )
  • SELECTs.names,s.salaries,s.names,dept,ROW_NUMBER()OVER(PARTITIONBYdeptBYsalariesDESC)rankFROMworkerss;
  • 结果如下,RANK列没有重复。


    结果如下,相同salaries时,RANK有重复,但连续。

    结果如下,相同salaries时,RANK有重复,同时不连续。

    总之,使用的时候一定要看自己的需要。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读