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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM