簡體   English   中英

Oracle中的row_number()函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM