ITPub博客

首页 > Linux操作系统 > Linux操作系统 > row_number(),dense_rank()和rank()的使用与区别

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

原创 Linux操作系统 作者:liangcq 时间:2010-08-25 14:24:30 0 删除 编辑

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

请登录后发表评论 登录
全部评论

注册时间:2009-06-01

  • 博文量
    10
  • 访问量
    17365