深く検討する:oracle中row_number()over()分析関数の使い方
3562 ワード
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