sql - 使用 row_number() 时是否可以依赖输出顺序

标签 sql sql-server tsql

我相信答案是 .我正在寻找一个 反例 表明不保证输出顺序,没有 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 上,输出顺序有两个属性:
  • 每个 customerId 的行是
    在输出中连续。
  • Row_number()是连续的
    每个客户 ID。

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

    或者,如果我错了,即使没有明确的 order by 子句,也可以提供一个指向引用的链接,该链接将表明这些排序是有保证的。

    最佳答案

    如果你想要一个有序的结果集,将 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
    

    关于sql - 使用 row_number() 时是否可以依赖输出顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110643/

    相关文章:

    sql - Drill SQL 中的 NumberFormatException 当它实际上是一个数字时转换为 BIGINT

    mysql - 左连接 - 未知列错误 1054

    按日期选择博客文章浏览量的 MySQL 性能

    sql - 定义可变长度的varchar

    sql-server - 在 SQL Server 中解密数据并推送到 View

    php - Laravel,如何消除下拉选择的一些 "pluck"值?

    javascript - 优化 Sequelize 中相关表的查询

    sql - 如何使用下一行和上一行选择两个日期之间的行

    sql - 递增整数 MSSQL

    sql-server - 如何让SQL Server知道不要在查询中使用缓存?