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

Sha*_*nce 3 sql t-sql sql-server

我相信答案是否定的.我正在寻找一个反例来证明输出顺序不能保证,没有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
Run Code Online (Sandbox Code Playgroud)

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

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

  2. Row_number() 在每个customerId中是顺序的.

我的理解是,如果没有明确的order by子句,则不保证这两个属性.我正在寻找一个示例,其中上述属性不是由order by子句强制执行,但只是MS SQL Server如何工作的结果.如果需要,可以随意在您的示例中开发自己的表定义,索引等.

或者,如果我错了,即使没有明确的order by子句,也会保证指向这些排序的参考链接.

Rem*_*anu 10

如果需要有序的结果集,请在SELECT中添加ORDER BY子句.期.其他任何东西都是间接的,可能会也可能不会起作用,这取决于您正在测试的当前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
Run Code Online (Sandbox Code Playgroud)