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