Oracle對查詢后的數據進行分組排序函數


Oracle對查詢后的數據進行分組排序函數


項目開發中的分組排序需求:
一,要求取出按field1分組后,並在每組中按照field2排序;
二,要求取出field1中已經分組排序好的前多少行的數據。

如下有三個函數可以根據需求選擇使用,這里通過一張表的示例和SQL語句闡述下oracle數據庫中用於分組排序函數的用法。

1.row_number() over()

row_number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)。 

Sql代碼 
select t.*,row_number() over(partition by accno order by createDate) row_number from Test t 
查詢結果如下:

大家可以注意到ACCNO為111的記錄有兩個相同的CREATEDATE,用row_number函數,他們的組內計數是連續唯一的,

2.rank() over()

rank()是跳躍排序,有兩個第二名時接下來就是第四名。


rank的sql:
select t.*,rank() over(partition by accno order by createDate) rank from Test t 
查詢結果:


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

3.dense_rank() over()

dense_rank()也是連續排序,有兩個第二名時仍然跟着第三名。


Sql代碼 
select t.*,dense_rank() over(partition by accno order by createDate) dense_rank from Test t 
查詢結果:


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

再比如有時會要求分組排序后分別取出各組內前多少的數據記錄(需要用到子查詢,先將數據進行分組排序,然后再分組排序后的數據中篩選符合條件的數據),sql如下:
Sql代碼 
select createDate,accno,money,row_number from (select t.*,row_number() over(partition by accno order by createDate) row_number from Test t) t1 where row_number<4 
查詢結果如下:

原文鏈接:https://blog.csdn.net/weixin_41477980/article/details/80317885


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM