淺談oracle中row_number() over()分析函數用法

淺談oracle中row_number() over()分析函數用法

row_number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的惟一的)。
與rownum的區別在於:使用rownum進行排序的時候是先對結果集加入僞劣rownum而後再進行排序,而此函數在包含排序從句後是先排序再計算行號碼。
row_number()和rownum差很少,功能更強一點(能夠在各個分組內從1開始排序)。
rank()是跳躍排序,有兩個第二名時接下來就是第四名(一樣是在各個分組內)
dense_rank()也是連續排序,有兩個第二名時仍然跟着第三名。相比之下row_number是沒有重複值的。

oracle 分析函數 row_number(),返回一個整數值(>=1);

語法格式:

1.row_number() over (order by col_1[,col_2 ...])

做用:按照col_1[,col_2 ...]排序,返回排序後的結果集,

此用法有點像rownum,爲每一行返回一個不相同的值:

select rownum,ename,job,   
       row_number() over (order by rownum) row_number   
from emp;   
    ROWNUM ENAME      JOB       ROW_NUMBER   
---------- ---------- --------- ----------   
         1 SMITH      CLERK              1   
         2 ALLEN      SALESMAN           2   
         3 WARD       SALESMAN           3   
         4 JONES      MANAGER            4   
         5 MARTIN     SALESMAN           5   
         6 BLAKE      MANAGER            6   
         7 CLARK      MANAGER            7   
         8 SCOTT      ANALYST            8   
         9 KING       PRESIDENT          9   
        10 TURNER     SALESMAN          10   
        11 ADAMS      CLERK             11   
        12 JAMES      CLERK             12   
        13 FORD       ANALYST           13   
        14 MILLER     CLERK             14 

若是沒有partition by子句, 結果集將是按照order by 指定的列進行排序;

with row_number_test as(   
     select 22 a,'twenty two' b from dual union all   
     select 1,'one' from dual union all   
     select 13,'thirteen' from dual union all   
     select 5,'five' from dual union all   
     select 4,'four' from dual)   
select a,b,   
       row_number() over (order by b)   
from row_number_test   
order by a; 

正如咱們所期待的,row_number()返回按照b列排序的結果,

而後再按照a進行排序,才獲得下面的結果:

A B          ROW_NUMBER()OVER(ORDERBYB)   
-- ---------- --------------------------   
1 one                                 3   
4 four                                2   
5 five                                1   
13 thirteen                            4   
22 twenty two                          5 

2.row_number() over (partition by col_n[,col_m ...] order by col_1[,col_2 ...])

做用:先按照col_n[,col_m ...進行分組,

再在每一個分組中按照col_1[,col_2 ...]進行排序(升序),

最後返回排好序後的結果集:

with row_number_test as(   
     select 22 a,'twenty two' b,'*' c from dual union all   
     select 1,'one','+' from dual union all   
     select 13,'thirteen','*' from dual union all   
     select 5,'five','+' from dual union all   
     select 4,'four','+' from dual)   
select a,b,   
       row_number() over (partition by c order by b) row_number   
from row_number_test   
order by a; 
 

這個例子中,咱們先按照c列分組,分爲2組('*'組,'+'組),

再按照每一個小組的b列進行排序(按字符串首字母的ascii碼排),

最後按照a列排序,獲得下面的結果集:

A B          ROW_NUMBER   
-- ---------- ----------   
1 one                 3   
4 four                2   
5 five                1   
13 thirteen            1   
22 twenty two         
本篇文章來源於 Linux公社網站(www.linuxidc.com)  原文連接:http://www.linuxidc.com/Linux/2011-04/34251.htmlinux

相關文章
相關標籤/搜索