SQL ROW_NUMBER和排序问题

时间:2012-06-11 13:18:47

标签: sql sql-server sorting sql-order-by row-number

在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

因此,您可以从上面的脚本中注意到我们希望返回按BatchDate和BatchNumber排序的记录。对于我们的一位客户来说,这不会发生: enter image description here

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

有人可以解释原因吗?

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

假设您希望给定BatchNumber的{​​{1}}最低BatchDateRow号为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 订购,请尝试以下操作:

{{1}}

答案 2 :(得分:2)

更改您的查询以在最外层查询中包含排序

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
order by Row

答案 3 :(得分:2)

ORDER BY排名函数中的ROW_NUMBER子句仅适用于计算该排名函数的值,但实际上并未对结果进行排序。

如果您希望按特定顺序返回记录,则需要在查询中指明:ORDER BY [Row]