row_number(),dense_rank()和rank()的使用与区别

--表test01是基于以前的学习笔记中的表,在此基础上做的试验

---row_number(),dense_rank()和rank()的使用与区别

select rownum,t.*,
       row_number() over(partition by address order by id asc) row_num,
       dense_rank() over(partition by address order by id asc) dense_rank,
       rank() over(partition by address order by id asc) rank
       from test01 t

---结果如图

 

---row_number()  按照字段属性,升序降序正常的排列数据,对于字段属性值相同的数据,不会出现并列数据的情况,如图蓝线所示。

---dense_rank()  同row_number() 功能相似,区别在于对于字段属性值相同的数据,会并为同一顺序值,如图比较蓝线所示。

---rank()        同dense_rank()   功能相似,区别在于并列的值之后的值,不会从接下来的值开始,而从正常的顺序值开始。比较红线可容易发现。
     
---如何取得一列中第N大的值?
---取第四名,并列的人只算一名,DENSE_RANK
select * from (select t.*, dense_rank() over(order by id desc) rank from test01 t)
where rank=4

---取第四名,并列的人有顺序,RANK,具体比较可以看上图
select * from (select t.*, rank() over(order by id desc) rank from test01 t)
where rank=4


---row_number()没有并列的情况,取每个部门薪水前三名的员工
select * from(
    select deptno,ename,sal ,
           row_number() over(partition by deptno order by sal) rn
           from emp
           )
           where rn<=3

未命名.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21684882/viewspace-671828/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21684882/viewspace-671828/

你可能感兴趣的:(row_number(),dense_rank()和rank()的使用与区别)