小编典典

使用row_number()时可以依赖输出的顺序吗

sql

我相信答案是 否定的 。并且我正在寻找一个 反例 来表明没有order by子句时不能保证输出的顺序。

考虑:

create table #order (orderId int primary key clustered
    , customerId int not null -- references customer(customerId)
    , orderDateTIme datetime not null)

insert into #order values (1, 100, '2009-01-01')
insert into #order values (2, 101, '2009-01-02')
insert into #order values (3, 102, '2009-01-03')
insert into #order values (4, 103, '2009-01-04')
insert into #order values (5, 100, '2009-01-05')
insert into #order values (6, 101, '2009-01-06')
insert into #order values (7, 101, '2009-01-07')
insert into #order values (8, 103, '2009-01-08')
insert into #order values (9, 105, '2009-01-09')
insert into #order values (10, 100, '2009-01-10')
insert into #order values (11, 101, '2009-01-11')
insert into #order values (12, 102, '2009-01-12')
insert into #order values (13, 103, '2009-01-13')
insert into #order values (14, 100, '2009-01-14')
insert into #order values (15, 100, '2009-01-15')
insert into #order values (16, 101, '2009-01-16')
insert into #order values (17, 102, '2009-01-17')
insert into #order values (18, 101, '2009-01-18')
insert into #order values (19, 100, '2009-01-19')
insert into #order values (20, 101, '2009-01-20')

select * from #order
-- Results in PK order due to clustered primary key

select orderId, CustomerId, orderDateTime
    , row_number() over (partition by customerId order by orderDateTime) RN
from #order

在MS SQL Server 2005上,输出顺序具有两个属性:

  1. 每个行在customerId输出中是连续的。

  2. Row_number() 在每个customerId中是连续的。

我的理解是,如果没有明确的order by子句,就不能保证这两个属性。我正在寻找一个示例,其中上述属性不成立,该属性不是由order
by子句强制执行的,而仅仅是MS SQL Server碰巧工作的结果。如果需要,可以在示例中随意开发自己的表定义,索引等。

或者,如果我错了,则指向引用的链接,即使没有明确的order by子句,也可以确保这些顺序得到保证。


阅读 257

收藏
2021-04-14

共1个答案

小编典典

如果需要有序的结果集, 则将ORDER BY子句添加到SELECT中
。时期。其他任何情况都是视情况而定,取决于您正在测试的当前SQL版本,优化器的当前状态以及火星在双鱼座的过渡阶段,是否可行。

一个与您的假设相矛盾的简单示例:

select orderId, CustomerId, orderDateTime
    , row_number() over (partition by customerId order by orderDateTime) RN
    , row_number() over (partition by orderDateTime order by customerId) AntiRN
from #order
2021-04-14