我在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正如您可以看到上面的输出,我使用部门作为分区依据,工资作为row_number的order by,它给我的排名是1,2,3。我试图理解的是,对于partition by和order by子句中的相同数据,oracle是否根据记录输入系统的时间分配row_number,就像上面的"Accounts“"300”中那样,它为系统中最早输入的记录指定了row_number 1。
有没有明确提到,如果它对相同的数据进行分区和排序,那么将根据这些记录进入系统的时间进行排名。
发布于 2019-08-02 19:46:07
我在这里试图理解的是,对于partition by和order by子句中的相同数据,oracle是否像上面的“row_number”"300“中那样,根据记录进入系统的时间分配帐户
不,它不是。SQL表格表示无序集合。没有排序,除非通过引用列值显式提供。
如果按相同的值进行排序,则无法保证行的顺序。请注意,当order by键中存在关联时,运行同一查询两次可能会产生不同的结果。甚至在同一查询中也是可能的。对于order by子句和分析函数都是如此。
如果您想要一个保证,那么您需要包括一个惟一的列作为最后一个排序关键字(它可能不是最后一个,但实际上是最后一个)。
发布于 2019-08-02 15:49:59
我猜你的最终结果可以使用ROWID伪列,因为ROWID只有在数据输入系统时才会生成-
SELECT T.*,ROW_NUMBER() OVER(partition by Dept order by salary, ROWID) as row_number
FROM test Thttps://stackoverflow.com/questions/57320027
复制相似问题