您的位置:首页 > 数据库 > Oracle

Oracle分析函数(1) row_number()、rank()、dense_rank()

2018-01-24 15:33 671 查看
分析函数row_number()、rank()、dense_rank()

 

ROW_NUMBER(): 

Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序),因为row_number()是分析函数而rownum是伪列所以row_number()一定要over而rownum不能over。

 

RANK():

Rank函数返回一个唯一的值,除非遇到相同的数据,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)。

 

 

DENSE_RANK():

Dense_rank函数返回一个唯一的值,除非当碰到相同数据,此时所有相同数据的排名都是一样的。

dense_rank()是连续排序,有两个第二名时仍然跟着第三名。他和row_number的区别在于row_number是没有重复值的。

下面举个例子:

 

【1】测试环境:

SQL> desc user_order;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------
 REGION_ID                                          NUMBER(2)

 CUSTOMER_ID                                     NUMBER(2)

 CUSTOMER_SALES                               NUMBER

 

【2】测试数据:

SQL> select * from user_order order by customer_sales;

 REGION_ID CUSTOMER_ID CUSTOMER_SALES
---------- ----------- --------------
         5           1              151162

        10          29         
   903383

         6           7              971585

        10          28            986964

         9          21           1020541

         9          22           1036146

         8          16           1068467

         6           8            1141638

         5           3            1161286

         5           5            1169926

         8          19           1174421

         7          12           1182275

         7          11           1190421

         6          10           1196748

         6           9            1208959

        10          30          1216858

         5             2                1224992

           9             24              1224992

           9             23              1224992

           
8          18           1253840

         7          15           1255591

         7          13           1310434

        10          27          1322747

         8          20           1413722

         6           6            1788836

        10          26          1808949

         5           4            1878275

         7          14           1929774

         8          17           1944281

         9          25           2232703

30 rows selected.

 

【3】row_number()、rank()、dense_rank()这三个分析函数的区别实例

 

SQL> select region_id, customer_id, sum(customer_sales) total,

  2         rank() over(order) rank,

  3         dense_rank() over(order) dense_rank,

  4         row_number() over(order) row_number

  5    from user_order

  6   group by region_id, customer_id;

 REGION_ID CUSTOMER_ID      TOTAL       RANK DENSE_RANK ROW_NUMBER
---------- ----------- ---------- ---------- ---------- ----------
 

 

        

         8          18                1253840         11         11         11

         5           2                 1224992         12         12         12

         9          23                1224992         12         12         13

         9          24                1224992         12         12         14

        10          30               1216858         15

 

 


30 rows selected.

 

请注意上面的绿色高亮部分,这里生动的演示了3种不同的排名策略:

①对于第一条相同的记录,3种函数的排名都是一样的:12

②当出现第二条相同的记录时,Rank和Dense_rank依然给出同样的排名12;而row_number则顺延递增为13,依次类推至第三条相同的记录

③当排名进行到下一条不同的记录时,可以看到Rank函数在12和15之间空出了13,14的排名,因为这2个排名实际上已经被第二、三条相同的记录占了。而Dense_rank则顺序递增。row_number函数也是顺序递增

比较上面3种不同的策略,我们在选择的时候就要根据客户的需求来定夺了:

①假如客户就只需要指定数目的记录,那么采用row_number是最简单的,但有漏掉的记录的危险

②假如客户需要所有达到排名水平的记录,那么采用rank或dense_rank是不错的选择。至于选择哪一种则看客户的需要,选择dense_rank或得到最大的记录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle