Oracle:Rank,Dense_Rank,Row_Number比较
来源:互联网 发布:淘宝买原味胖次 编辑:程序博客网 时间:2024/06/05 00:21
正常情况下rank等这三个分析函数的使用是可以替代,但真正碰到特别需求的时候,就需要注意他们的区别了。
文章出自:http://trailblizer.blog.163.com/blog/static/59630364200982792143361/
一个员工信息表
Create Table EmployeeInfo (CODE Number(3) Not Null,EmployeeName varchar2(15),DepartmentID Number(3),Salary NUMBER(7,2),Constraint PK_EmployeeInfo Primary Key (CODE));Select * From EMPLOYEEINFO
现执行SQL语句:
Select EMPLOYEENAME,SALARY, RANK() OVER (Order By SALARY Desc) "RANK",DENSE_RANK() OVER (Order By SALARY Desc ) "DENSE_RANK",ROW_NUMBER() OVER(Order By SALARY Desc) "ROW_NUMBER" From EMPLOYEEINFO结果如下:
Rank,Dense_rank,Row_number函数为每条记录产生一个从1开始至N的自然数,N的值可能小于等于记录的总数。这3个函数的唯一区别在于当碰到相同数据时的排名策略。
①ROW_NUMBER:
Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。
②DENSE_RANK:
Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。
③RANK:
Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。
同时也可以分组排序,也就是在Over从句内加入Partition by groupField:
Select DEPARTMENTID,EMPLOYEENAME,SALARY, RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc) "RANK",DENSE_RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc ) "DENSE_RANK",ROW_NUMBER() OVER( Partition By DEPARTMENTID Order By SALARY Desc) "ROW_NUMBER"From EMPLOYEEINFO
结果如下:
现在如果插入一条工资为空的记录,那么执行上述语句,结果如下:
会发现空值的竟然排在了第一位,这显然不是想要的结果。解决的办法是在Over从句Order By后加上 NULLS Last即:
Select EMPLOYEENAME,SALARY, RANK() OVER (Order By SALARY Desc Nulls Last) "RANK",DENSE_RANK() OVER (Order By SALARY Desc Nulls Last) "DENSE_RANK",ROW_NUMBER() OVER(Order By SALARY Desc Nulls Last ) "ROW_NUMBER" From EMPLOYEEINFO
结果如下:
- Oracle:Rank,Dense_Rank,Row_Number比较
- ORACLE Rank, Dense_rank, row_number
- Oracle笔记--row_number rank dense_rank
- Oracle分级排序函数Rank、Dense_Rank、Row_Number比较
- row_number、rank、dense_rank和ntile的比较
- rank()、dense_rank()、row_number()、first、last比较
- Oracle:分析函数2(Rank, Dense_rank, row_number)
- oracle分析函数(rank(),dense_rank(),row_number())
- oracle分析函数Rank, Dense_rank, row_number
- oracle 分析函数Rank, Dense_rank, row_number
- oracle分析函数Rank, Dense_rank, row_number
- oracle分析函数Rank, Dense_rank, row_number
- oracle分析函数Rank, Dense_rank, row_number
- ORACLE分析函数(3)---rank,dense_rank,row_number
- oracle 分析函数 RANK、DENSE_RANK、ROW_NUMBER
- oracle分析函数Rank, Dense_rank, row_number
- oracle分析函数Rank, Dense_rank, row_number
- oracle分析函数Rank, Dense_rank, row_number
- 对下一步工作的思考 和 临时分工
- Oracle 唯一 约束(unique constraint) 与 索引(index) 关系说明
- ROM, RAM, SRAM, DRAM, EPROM, EEPROM, Flash, NOR Flash, NAND Flash关系
- 如何成为一个合格的职场人
- DSP概念
- Oracle:Rank,Dense_Rank,Row_Number比较
- 微处理器, 中央处理器的概念
- SoC, PLD, FPGA, ASIC, CPLD, SPLD 的区别
- RISC, CISC 的区别
- 安装ubuntu并sync android源码的笔记
- MMU概念
- android测试:使用DOM读取xml文件的内容
- UART概念
- 如何解决Bug