天天看點

oracle中col 的用法,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

oracle中col 的用法,oracle中row_number() over()分析函數用法

如果沒有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

oracle中col 的用法,oracle中row_number() over()分析函數用法

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;

oracle中col 的用法,oracle中row_number() over()分析函數用法
oracle中col 的用法,oracle中row_number() over()分析函數用法

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

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

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

A B          ROW_NUMBER

-- ---------- ----------

1 one                 3

4 four                2

5 five                1

13 thirteen            1

22 twenty two