RANK、DENSE_RANK以及ROW_NUMBER区别

前端之家收集整理的这篇文章主要介绍了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有重复,同时不连续。

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

    原文链接:https://www.f2er.com/oracle/206343.html

    猜你在找的Oracle相关文章