Oracle的分析函數介紹

項目開發中,咱們有時會碰到須要分組排序來解決問題的狀況,如:

一、要求取出按field1分組後,並在每組中按照field2排序;二、亦或更加要求取出1中已經分組排序好的前多少行的數據

這裏經過一張表的示例和SQL語句闡述下oracle數據庫中用於分組排序函數的用法。

a、row_number() over()

row_number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的惟一的)。
與rownum的區別在於:使用rownum進行排序的時候是先對結果集加入僞劣rownum而後再進行排序,而此函數在包含排序從句後是先排序再計算行號碼。row_number()和rownum差很少,功能更強一點(能夠在各個分組內從1開始排序)。
b、rank() over()

rank()是跳躍排序,有兩個第二名時接下來就是第四名(一樣是在各個分組內)

c、dense_rank() over()

dense_rank()也是連續排序,有兩個第二名時仍然跟着第三名。相比之下row_number是沒有重複值的。


示例:

若有表Test,數據以下

好比要根據ACCNO分組,而且每組按照CREATEDATE排序,是組內排序,並非全部的數據統一排序,

用下列語句實現:

[AppleScript]
純文本查看
複製代碼
?
1
< font style = "color:rgb(79, 79, 79)" > < font face = "-apple-system, &quot;" > < font style = "font-size:16px" > select t. * , row_number ( ) over ( partition by accno order by createDate ) row_number from Test t < / font > < / font > < / font >

查詢結果以下:

你們能夠注意到ACCNO爲111的記錄有兩個相同的CREATEDATE,用row_number函數,他們的組內計數是連續惟一的,可是若是用rank或者dense_rank函數,效果就不同,以下:

rank的sql:

[AppleScript]
純文本查看
複製代碼
?
1
< font style = "color:rgb(79, 79, 79)" > < font face = "-apple-system, &quot;" > < font style = "font-size:16px" > select t. * , rank ( ) over ( partition by accno order by createDate ) rank from Test t < / font > < / font > < / font >

查詢結果:

能夠發現相同CREATEDATE的兩條記錄是兩個第2時接下來就是第4.

dense_rank的sql:

[AppleScript]
純文本查看
複製代碼
?
1
< font style = "color:rgb(79, 79, 79)" > < font face = "-apple-system, &quot;" > < font style = "font-size:16px" > select t. * , dense_rank ( ) over ( partition by accno order by createDate ) dense_rank from Test t < / font > < / font > < / font >

查詢結果:

能夠發現相同CREATEDATE的兩個字段是兩個第2時接下來就是第3.

項目中特殊的業務需求可能會要求用以上三個不一樣的函數,具體狀況具體對待。

再好比有時會要求分組排序後分別取出各組內前多少的數據記錄,sql以下:

[AppleScript]
純文本查看
複製代碼
?
1
< font style = "color:rgb(79, 79, 79)" > < font face = "-apple-system, &quot;" > < font style = "font-size:16px" > select createDate , accno , money , row_number from ( select t. * , row_number ( ) over ( partition by accno order by createDate ) row_number from Test t ) t 1 where row_number < 4 < / font > < / font > < / font >

查詢結果以下:

更多技術資訊可關注:gzitcastsql

相關文章
相關標籤/搜索