RANK、DENSE_RANK以及ROW_NUMBER区别

场景

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

语法

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

  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列没有重复。


    Highlighter bg_sql" style="font-family:Consolas,DENSE_RANK()OVER(PARTITION结果如下,相同salaries时,RANK有重复,但连续。

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

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

    相关文章

    Java Oracle 结果集是Java语言中处理数据库查询结果的一种方...
    Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密...
    Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台...
    随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的...
    Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常...
    Java 是一门非常流行的编程语言,它可以运行于各种操作系统上...