设为首页 收藏本站
查看: 1802|回复: 0

[经验分享] DB2中的ROW_NUMBER() OVER()函数用法

[复制链接]

尚未签到

发表于 2016-11-19 03:33:09 | 显示全部楼层 |阅读模式
  ROW_NUMBER() OVER()大概有俩方面的作用 1,分页, 并返回分页结果集。2,是对数据进行处理 分组
  db2的分页:



select tmp.* from (
SELECT rownumber() over() as rowid, ter.EMPLOYEE_NAME as         name,ter.EMPLOYEE_NUMBER as misId,a1.ORG_NAME as orgName,a1.ORG_CODE, a1.POSITION_NAME as duty,ter.LEAVE_DATE as leaveDate,abr.CENSOR_NUM  as documentNumber FROM
(
SELECT EMPLOYEE_NUMBER, START_DATE,ORG_NAME,ORG_CODE,POSITION_NAME ,row_number()over(partition BY EMPLOYEE_NUMBER ORDER BY START_DATE DESC) AS aaa FROM
EDBADM.T_ODS_EMP_ASSIGN WHERE JOB_NAME != '职员' ) A1 INNER JOIN EDBADM.T_ODS_EMP_TERMINATE ter
ON  ter.EMPLOYEE_NUMBER=A1.EMPLOYEE_NUMBER
left join EDBADM.T_ODS_EMP_ABROAD abr
on
abr.EMPLOYEE_NUMBER=A1.EMPLOYEE_NUMBER  
WHERE  a1.AAA =1  AND char(ter.LEAVE_DATE) =  '2011-02-20'  
AND  ter.EMPLOYEE_NAME  LIKE '%杨福辉%'   
AND ter.EMPLOYEE_NUMBER ='27004778'   )
as tmp where 1=1 AND tmp.rowid >= 1   AND tmp.rowid <=10   order by tmp.leaveDate desc   

  其中值得注意的是:条件必须放到rownumber 范围内。 这样的话返回的结果才是从1开始。例如吧AND ter.EMPLOYEE_NUMBER ='27004778'  放到tmp 后面则返回的结果集的rowid 直接从其他地方开始。并不是从一开始。这样分页的时候很容易出现,难以发觉的错误。
  2:row_number() over()分组排序功能:



SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (partition by workdept ORDER BY salary desc) rank FROM employee   
02. --------------------------------------  
03. 000010  A00 152750  1  
04. 000110  A00 66500   2  
05. 000120  A00 49250   3  
06. 200010  A00 46500   4  
07. 200120  A00 39250   5  
08. 000020  B01 94250   1  
09. 000030  C01 98250   1  
10. 000130  C01 73800   2  

  对查询结果进行排序:(无分组)
  当不放条件的时候 返回的结果 从1开始一直到条数最大值



SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (ORDER BY salary desc) rank FROM employee   
02. --------------------------------------  
03. 000010  A00 152750  1  
04. 000030  C01 98250   2  
05. 000070  D21 96170   3  
06. 000020  B01 94250   4  
07. 000090  E11 89750   5  
08. 000100  E21 86150   6  
09. 000050  E01 80175   7  
10. 000130  C01 73800   8  
11. 000060  D11 72250   9  

  3:rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).



select workdept,salary,rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept;  
02. ------------------  
03. A00 39250   1  
04. A00 46500   2  
05. A00 49250   3  
06. A00 66500   4  
07. A00 152750  5  
08. B01 94250   1  
09. C01 68420   1  
10. C01 68420   1  
11. C01 73800   3  

  4:dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .



select workdept,salary,dense_rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept;  
02. ------------------  
03. A00 39250   1  
04. A00 46500   2  
05. A00 49250   3  
06. A00 66500   4  
07. A00 152750  5  
08. B01 94250   1  
09. C01 68420   1  
10. C01 68420   1  
11. C01 73800   2  
12. C01 98250   3  

  5:---@使用ROW_NUMBER删除重复数据
---假设表TAB中有a,b,c三列,可以使用下列语句删除a,b,c都相同的重复行



DELETE FROM (select year,QUARTER,RESULTS,row_number() over(partition by YEAR,QUARTER,RESULTS order by YEAR,QUARTER,RESULTS) AS ROW_NO FROM SALE )   
02. WHERE ROW_NO>1  

  总结:




  row_number()over(partition by col1 order bycol2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。  与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。  row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。  rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)  dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。  oracle 分析函数 row_number(),返回一个整数值(>=1);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-302196-1-1.html 上篇帖子: DB2 SQL脚本批量执行(转) 下篇帖子: DB2锁表相关笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表