区分函数 ROW_NUMBER(), RANK(), and DENSE_RANK()

  • 2020 年 2 月 10 日
  • 筆記

今天给大家推送第一篇SQL文章《辨析函数 ROW_NUMBER(), RANK(), and DENSE_RANK() 》,接下来所讨论的全部内容都是基于ORACLE数据库

其实这三个函数的区别很容易记住,首先,创建一个reference table 叫做refer_table.

CREATE TABLE refer_table ( ref_var  varchar(1));  insert into refer_table(ref_var) values('a');insert into refer_table(ref_var) values('a');insert into refer_table(ref_var) values('a');insert into refer_table(ref_var) values('b');insert into refer_table(ref_var) values('c');insert into refer_table(ref_var) values('c');insert into refer_table(ref_var) values('d');insert into refer_table(ref_var) values('e');  commit;

接下来,我们对这个table同时运行上述三个函数,运行下述代码

SELECT   ref_var,   ROW_NUMBER() OVER(ORDER BY ref_var) as row_number,   RANK()       OVER(ORDER BY ref_var) as rank,   DENSE_RANK() OVER(ORDER BY ref_var) as dense_rank  FROM refer_tableORDER BY 1, 2

得到下面的结果

ref_var row_number rank dense_ranka	   1	     1	   1  a	   2	     1	   1  a	   3	     1	   1  b	   4	     4	   2  c	   5	     5	   3  c	   6	     5	   3  d	   7	     7	   4  e	   8	     8	   5

由上述结果可对ROW_NUMBER(), RANK(), and DENSE_RANK() 区别做如下总结:

  1. row_number ()在进行排序的时候,针对相同的元素,会赋予不同的序号值,且序号值是唯一不重复并且是连续的。
  2. rank()进行排序的时候,针对相同的元素(a,a,a),会赋予相同的序号值 1, 接下来对元素b进行排序的时候,赋予的的序号4,也就是说序号值是跳跃的。

3. dense_rank()排序的时候,针对相同元素(a,a,a),会赋予相同的序号值1, 紧接着对元素b赋值是2,也就是序号值是连续可重复的

在今后的日子,文章会尽量保持一周一更的频率,希望大家喜欢!如有任何疑问,欢迎后台回复,我看到的话都会回复的。