深く検討する:oracle中row_number()over()分析関数の使い方


row_number()over(partition by col 1 order by col 2)は、col 1パケットに従ってパケット内部でcol 2に従って並べ替えられ、この関数で計算された値は、各グループの内部並べ替え後の順序番号(グループ内で連続する一意)を表しています。rownumとの違いは、rownumを使って並べ替えをするときは、結果集に偽のrownumを入れて並べ替えますが、この関数は並べ替えの文を含めて並べ替えてから行番号を計算します。row_number()とrownumはほぼ同じで、機能がより強いです。rank()はジャンプ順で、2位がある時は次に4位(同じグループ内)dense_です。rank()も連続して順位をつけて、2番目がある時依然として第3位に続いています。それに比べて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 
.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列に並べ替えて、最後にa列に並べば、次の結果セットが得られます。

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