--表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
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21684882/viewspace-671828/ ,如需转载,请注明出处,否则将追究法律责任。