在Oracle數據庫中,ROW_NUMBER()
窗口函數會為結果集中的每一行分配一個唯一的連續整數,根據指定的排序順序。當遇到重復值時,ROW_NUMBER()
會按照排序順序為這些重復值分配相同的行號。
例如,假設我們有一個包含員工信息的表employees
,其中id
是員工ID,name
是員工姓名,我們想要為每個員工分配一個基于id
的ROW_NUMBER
。以下是一個查詢示例:
SELECT id, name, ROW_NUMBER() OVER (ORDER BY id) AS row_num
FROM employees;
在這個查詢中,ROW_NUMBER()
函數會根據id
列的值對結果集進行排序,并為每個員工分配一個行號。即使有重復的id
值,ROW_NUMBER()
也會為它們分配相同的行號,因為它是基于排序順序的。
如果你想要在遇到重復值時跳過行號(即不分配行號),你可以使用DENSE_RANK()
窗口函數替代ROW_NUMBER()
。DENSE_RANK()
會為重復值分配相同的排名,但不會跳過排名。以下是一個使用DENSE_RANK()
的查詢示例:
SELECT id, name, DENSE_RANK() OVER (ORDER BY id) AS rank
FROM employees;
在這個查詢中,如果有重復的id
值,DENSE_RANK()
會為它們分配相同的排名,并且不會跳過任何排名。