繁体   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