Oracle数据库中Rank等函数的比较与选择

数据库 Oracle
本文我们通过一个实例来对Oracle数据库中的Rank,Dense_Rank,Row_Number进行比较,通过比较我们可以学习结合具体得情况来使用最合适的函数,接下来就让我们来一起学习吧。

Oracle数据库中Rank,Dense_Rank,Row_Number函数有什么样的区别呢?在实际的应用中我们又该如何去选择呢?本文结合实例说明了这些。

首先我们先创建一个员工信息表,在查询分析器中执行以下的代码:

  1. Create Table EmployeeInfo (CODE Number(3) Not Null,EmployeeName varchar2(15),DepartmentID Number(3),Salary NUMBER(7,2),  
  2.  
  3. Constraint PK_EmployeeInfo Primary Key (CODE)); 

创建完成后,在企业管理其中打开表,录入一些信息,为了让大家清楚录入的内容,录入完毕后我执行了查询语句Select * From EMPLOYEEINFO;将员工信息表的内容入下图所示:

Oracle数据库中Rank等函数的比较与选择

现执行SQL语句:

  1. Select EMPLOYEENAME,SALARY,  
  2.  
  3. RANK() OVER (Order By SALARY Desc)  "RANK",  
  4.  
  5. DENSE_RANK() OVER (Order By SALARY Desc ) "DENSE_RANK",  
  6.  
  7. ROW_NUMBER() OVER(Order By SALARY Desc) "ROW_NUMBER"  
  8.  
  9.  From EMPLOYEEINFO 

结果如下:

Oracle数据库中Rank等函数的比较与选择

说明:Rank,Dense_rank,Row_number函数为每条记录产生一个从1开始至N的自然数,N的值可能小于等于记录的总数。这3个函数的唯一区别在于当碰到相同数据时的排名策略。

①ROW_NUMBER:

Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。

②DENSE_RANK:

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

③RANK:

Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在***一条相同记录和下一条不同记录的排名之间空出排名。

同时也可以分组排序,也就是在Over从句内加入Partition by groupField:

  1. Select DEPARTMENTID,EMPLOYEENAME,SALARY,  
  2.  
  3. RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc)  "RANK",  
  4.  
  5. DENSE_RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc ) "DENSE_RANK",  
  6.  
  7. ROW_NUMBER() OVER( Partition By DEPARTMENTID Order By SALARY Desc) "ROW_NUMBER"  
  8.  
  9. From EMPLOYEEINFO 

结果如下:

Oracle数据库中Rank等函数的比较与选择

现在如果插入一条工资为空的记录,那么执行上述语句,结果如下:

Oracle数据库中Rank等函数的比较与选择

会发现空值的竟然排在了***位,这显然不是想要的结果。解决的办法是在Over从句Order By后加上 NULLS Last即:

  1. Select EMPLOYEENAME,SALARY,  
  2.  
  3. RANK() OVER (Order By SALARY Desc  Nulls Last)  "RANK",  
  4.  
  5. DENSE_RANK() OVER (Order By SALARY Desc Nulls Last) "DENSE_RANK",  
  6.  
  7. ROW_NUMBER() OVER(Order By SALARY Desc Nulls Last ) "ROW_NUMBER"  
  8.  
  9. From EMPLOYEEINFO 

结果如下:

Oracle数据库中Rank等函数的比较与选择

本文就介绍到这里,如果您想了解更多关于Oracle的内容,可以到我们网站的Oracle频道:http://database.51cto.com/oracle/,谢谢大家的支持!

【编辑推荐】

  1. C#利用ODP.net连接Oracle数据库
  2. 利用Sql Server将Excel中的数据导入Oracle
  3. 在存储过程中连接远程Oracle数据库并进行操作
  4. 环境变量导致ASP.Net无法连接Oracle的一个案例
  5. ORACLE数据库PL/SQL编程之把过程与函数说透
责任编辑:赵鹏 来源: 网易博客
相关推荐

2011-03-18 11:24:07

Oracle 数据库时间问题

2010-03-31 19:34:03

Oracle数据库

2010-03-30 17:40:59

Oracle数据库

2010-04-29 09:35:31

Oracle数据库

2010-11-15 16:13:24

Oracle数据库性能

2021-01-10 15:29:53

开源数据库数据库

2010-05-14 17:34:36

MySQL数据库列值

2011-07-22 09:33:15

OracleMySQLPostgreSQL

2010-08-25 15:13:22

DB2Oracle数据库

2021-10-26 08:00:00

数据库架构技术

2021-09-02 10:54:39

Pandas函数数据

2011-08-23 15:16:54

OracleMySQL

2009-09-04 09:54:59

数据库名

2009-07-02 00:00:00

OOPOracle

2011-04-12 10:21:24

Oracle数据库索引树

2010-09-10 16:12:08

sql函数判断

2010-09-06 17:46:48

SQL函数

2010-05-21 10:22:37

MySQL数据库

2011-05-26 13:36:40

Oracle数据库时间处理

2010-04-02 17:11:45

Oracle数据库
点赞
收藏

51CTO技术栈公众号