日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle 分析函数--Row_Number()

發(fā)布時(shí)間:2025/6/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle 分析函数--Row_Number() 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

row_number() over ([partition by col1] order by col2) ) as 別名
表示根據(jù)col1分組,在分組內(nèi)部根據(jù) col2排序
而這個(gè)“別名”的值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的),[partition by col1] 可省略。

??

ROW_NUMBER()語法如下:

1、row_number() over(order by column asc)先對列column按照升序,再為每條記錄返回一個(gè)序列號:

select personalid,row_number() over(order by personalid asc) rn from ?neogoodsrule

2、row_number() over(partition by column1 order by column2 asc) 先按照column1分組,再對分組后的數(shù)據(jù)進(jìn)行以column2升序排列

select personalid,ct_smp_type,row_number() over(partition by personalid order by ct_smp_type asc) rn from neogoodsrule

?row_number()over(partition by col1 order by col2)表示根據(jù)col1分組,在分組內(nèi)部根據(jù)col2排序,而此函數(shù)計(jì)算的值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的)。
與rownum的區(qū)別在于:使用rownum進(jìn)行排序的時(shí)候是先對結(jié)果集加入偽劣rownum然后再進(jìn)行排序,而此函數(shù)在包含排序從句后是先排序再計(jì)算行號碼。
row_number()和rownum差不多,功能更強(qiáng)一點(diǎn)(可以在各個(gè)分組內(nèi)從1開始排序)。
rank()是跳躍排序,有兩個(gè)第二名時(shí)接下來就是第四名(同樣是在各個(gè)分組內(nèi))
dense_rank()也是連續(xù)排序,有兩個(gè)第二名時(shí)仍然跟著第三名。相比之下row_number是沒有重復(fù)值的。

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

語法格式:

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

作用:按照col_1[,col_2 ...]排序,返回排序后的結(jié)果集,

此用法有點(diǎn)像rownum,為每一行返回一個(gè)不相同的值:

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 指定的列進(jìn)行排序;

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進(jìn)行排序,才得到下面的結(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 ...進(jìn)行分組,

再在每個(gè)分組中按照col_1[,col_2 ...]進(jìn)行排序(升序),

最后返回排好序后的結(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;?
?

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

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

最后按照a列排序,得到下面的結(jié)果集:

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

轉(zhuǎn)載于:https://www.cnblogs.com/kting/p/3070681.html

總結(jié)

以上是生活随笔為你收集整理的Oracle 分析函数--Row_Number()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。