• DB2中的ROW_NUMBER() OVER()函数用法


     

    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);

  • 相关阅读:
    已知自然数A、B不互质,A、B最大公约数和最小公倍数之和为35,那么A+B的最小值是多少?
    mysql null字段 空字段 查询效率
    sql注入和网站攻击思路
    软件服务新时代:开源软件的盈利模式
    eclipse maven插件配置,jdk全局版本调整
    spring事务(isolation隔离级别,propagation事务传播属性)
    GBDT 算法
    博客园的 “随笔、文章、新闻、日记”有啥区别
    1.3 Java中的标识符和关键字
    1.1 Java 的概述
  • 原文地址:https://www.cnblogs.com/wupeng88/p/4554743.html
Copyright © 2020-2023  润新知