SQL ROW_NUMBER和排序问题

vk_*_*use 5 sql sql-server sorting row-number sql-order-by

在SQL 2005/2008数据库中,我们有表BatchMaster.列:RecordId bigint - autoincremental id,BatchNumber bigint - 唯一的非聚集索引,BatchDate).我们有sproc返回此表中的分页数据.该sproc适用于大多数客户端,但在一个SQL服务器实例中,我们遇到记录顺序问题.一般来说,我们这样做

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow
Run Code Online (Sandbox Code Playgroud)

因此,正如您可以从上面的脚本中注意到的那样,我们希望返回按BatchDate和BatchNumber排序的记录.对于我们的一位客户来说,这不会发生: 在此输入图像描述

记录顺序错误.另外,请注意第一列(行),它不是按升序排列的.

有人能解释为什么这样吗?

Mar*_*rtW 7

您的代码实际上并没有对结果进行排序,它只根据BatchDate和Batchnumber的顺序设置'Row',并且似乎正确地执行了此操作.您需要在语句中添加ORDER BY Row.


aF.*_*aF. 7

假设你想要BatchNumber一个BatchDate具有最小Row数字的给定的最低值并且你想要orderer Row,请尝试这样:

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber asc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow
order by Row
Run Code Online (Sandbox Code Playgroud)