[英]row_number() function in oracle
我在oracle中使用ROW_NUMBER函數,並試圖了解當partition by和order by子句擁有相同數據時排名將如何變化,然后排名將如何工作(如果有重復記錄)。
以下是樣本數據集
select * from test
結果
Dept salary created date
HR 500 25-Jul
HR 200 25-Jul
HR 500 26-Jul
Accounts 300 25-Jan
Accounts 300 26-Jan
Accounts 300 27-Jan
我根據以上設置運行了row_number函數
select *,ROW_NUMBER() OVER(partition by Dept order by salary) as row_number
from test
結果
Dept salary created date row_number
HR 500 25-Jul 1
HR 200 25-Jul 1
HR 500 26-Jul 2
Accounts 300 25-Jan 1
Accounts 300 26-Jan 2
Accounts 300 27-Jan 3
如您在上面的輸出中所看到的,我使用Dept作為row_number的分區,按薪水作為row_number的順序,它給了我1,2,3的排名。 我想在這里理解的是,對於分區by和order by子句中的相同數據,oracle是否根據記錄進入系統的時間來分配row_number,如上面的“ Accounts”“ 300”一樣,它為row_number 1最早輸入系統“ 25 Jan”的記錄
在任何地方都清楚地提到過,如果它對相同的數據進行分區和排序,則將根據這些記錄何時進入系統來進行排名。
我在這里試圖理解的是,對於分區by和order by子句中的相同數據,oracle是否根據記錄輸入系統的時間來分配row_number,如上面的“帳戶”“ 300”
不,不是的。 SQL表表示無序集。 沒有排序,除非通過引用列值明確提供。
如果按相同的值排序, 則不能保證行的順序 。 請注意,按鍵order by
綁定時,兩次運行相同的查詢可能會產生不同的結果。 在同一查詢中甚至可能。 對於order by
子句和分析函數均是如此。
如果需要擔保,則需要包括一個唯一列作為最后一個排序鍵(當然,它不能是最后一個,但實際上是最后一個)。
我想您可以使用ROWID偽列實現最終結果,因為僅當數據輸入系統時才生成ROWID-
SELECT T.*,ROW_NUMBER() OVER(partition by Dept order by salary, ROWID) as row_number
FROM test T
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.