深入探討:oracle中row_number() over()分析函數(shù)用法
更新時間:2013年05月30日 09:42:32 作者:
本篇文章是對oracle中row_number() over()分析函數(shù)的用法進行了詳細的分析介紹,需要的朋友參考下
row_number()over(partition by col1 order by col2)表示根據(jù)col1分組,在分組內(nèi)部根據(jù)col2排序,而此函數(shù)計算的值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的)。
與rownum的區(qū)別在于:使用rownum進行排序的時候是先對結(jié)果集加入偽劣rownum然后再進行排序,而此函數(shù)在包含排序從句后是先排序再計算行號碼。
row_number()和rownum差不多,功能更強一點(可以在各個分組內(nèi)從1開始排序)。
rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內(nèi))
dense_rank()也是連續(xù)排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重復值的。
oracle 分析函數(shù) row_number(),返回一個整數(shù)值(>=1);
語法格式:
1.row_number() over (order by col_1[,col_2 ...])
作用:按照col_1[,col_2 ...]排序,返回排序后的結(jié)果集,
此用法有點像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子句, 結(jié)果集將是按照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列排序的結(jié)果,
然后再按照a進行排序,才得到下面的結(jié)果:
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 ...]進行排序(升序),
最后返回排好序后的結(jié)果集:
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列排序,得到下面的結(jié)果集:
A B ROW_NUMBER
-- ---------- ----------
1 one 3
4 four 2
5 five 1
13 thirteen 1
22 twenty two
與rownum的區(qū)別在于:使用rownum進行排序的時候是先對結(jié)果集加入偽劣rownum然后再進行排序,而此函數(shù)在包含排序從句后是先排序再計算行號碼。
row_number()和rownum差不多,功能更強一點(可以在各個分組內(nèi)從1開始排序)。
rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內(nèi))
dense_rank()也是連續(xù)排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重復值的。
oracle 分析函數(shù) row_number(),返回一個整數(shù)值(>=1);
語法格式:
1.row_number() over (order by col_1[,col_2 ...])
作用:按照col_1[,col_2 ...]排序,返回排序后的結(jié)果集,
此用法有點像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子句, 結(jié)果集將是按照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列排序的結(jié)果,
然后再按照a進行排序,才得到下面的結(jié)果:
復制代碼 代碼如下:
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 ...]進行排序(升序),
最后返回排好序后的結(jié)果集:
復制代碼 代碼如下:
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列排序,得到下面的結(jié)果集:
復制代碼 代碼如下:
A B ROW_NUMBER
-- ---------- ----------
1 one 3
4 four 2
5 five 1
13 thirteen 1
22 twenty two
相關(guān)文章
oracle誤刪數(shù)據(jù)恢復方法小結(jié)
最近幫客戶維護一個數(shù)據(jù)庫,數(shù)據(jù)庫中的數(shù)據(jù)被他誤刪了,下面就為大家分享下我是通過什么方法來實現(xiàn)的2015-08-08
Oracle逗號分隔列轉(zhuǎn)行實現(xiàn)方法
在做系統(tǒng)時,經(jīng)常會遇到在一個字段中,用逗號或其他符號分隔存儲多個信息,例如保存某個用戶的一對多權(quán)限時,在權(quán)限組這個字段中,就會逗號分隔保存多個權(quán)限編號。2010-12-12
ORACLE出現(xiàn)錯誤1033和錯誤ORA-00600的解決方法
這篇文章主要介紹了ORACLE出現(xiàn)錯誤1033和錯誤ORA-00600的解決方法,需要的朋友可以參考下2014-07-07
Oracle數(shù)據(jù)庫中字符串截取最全方法總結(jié)
Oracle提供了多種截取字符串的操作方法,可以根據(jù)具體需求選擇合適的方法進行操作,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Oracle數(shù)據(jù)庫中字符串截取的最全方法,需要的朋友可以參考下2024-03-03
解析如何查看Oracle數(shù)據(jù)庫中某張表的字段個數(shù)
本篇文章是對查看Oracle數(shù)據(jù)庫中某張表的字段個數(shù)進行了詳細的分析介紹,需要的朋友參考下2013-06-06
Oracle數(shù)據(jù)庫刪除表空間后磁盤空間不釋放的問題及解決
這篇文章主要介紹了Oracle數(shù)據(jù)庫刪除表空間后磁盤空間不釋放的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11

