首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle中的row_number()函数

oracle中的row_number()函数
EN

Stack Overflow用户
提问于 2019-08-02 12:39:00
回答 2查看 1.2K关注 0票数 0

我在oracle中使用ROW_NUMBER函数,并试图了解当partition by和order by子句包含相同的数据时,它将如何表现,那么排名将如何工作(如果有重复的记录)。

以下是示例数据集

代码语言:javascript
复制
select * from test

结果

代码语言:javascript
复制
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函数

代码语言:javascript
复制
select *,ROW_NUMBER() OVER(partition by Dept order by salary) as row_number
from test

结果

代码语言:javascript
复制
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。

有没有明确提到,如果它对相同的数据进行分区和排序,那么将根据这些记录进入系统的时间进行排名。

EN

回答 2

Stack Overflow用户

发布于 2019-08-02 19:46:07

我在这里试图理解的是,对于partition by和order by子句中的相同数据,oracle是否像上面的“row_number”"300“中那样,根据记录进入系统的时间分配帐户

不,它不是。SQL表格表示无序集合。没有排序,除非通过引用列值显式提供。

如果按相同的值进行排序,则无法保证行的顺序。请注意,当order by键中存在关联时,运行同一查询两次可能会产生不同的结果。甚至在同一查询中也是可能的。对于order by子句和分析函数都是如此。

如果您想要一个保证,那么您需要包括一个惟一的列作为最后一个排序关键字(它可能不是最后一个,但实际上是最后一个)。

票数 0
EN

Stack Overflow用户

发布于 2019-08-02 15:49:59

我猜你的最终结果可以使用ROWID伪列,因为ROWID只有在数据输入系统时才会生成-

代码语言:javascript
复制
SELECT T.*,ROW_NUMBER() OVER(partition by Dept order by salary, ROWID) as row_number
FROM test T
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57320027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档