如何在有序查询中正确使用Sql Server行数函数?

如何在有序查询中正确使用Sql Server行数函数?,sql,sql-server,pagination,Sql,Sql Server,Pagination,我试图从MSSQL中理解行数,并获得一些经验 我有以下两个片段: SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (order by p.DtDistribuicao) AS RowNumber FROM ProcessoInstanciaFonte as p ) as q WHERE q.RowNumber BETWEEN 1 AND 20; 及 它们都应该返回相同的行,但

我试图从MSSQL中理解行数,并获得一些经验

我有以下两个片段:

SELECT * 
    FROM 
    (
        SELECT *,
        ROW_NUMBER() OVER (order by p.DtDistribuicao) AS RowNumber
        FROM ProcessoInstanciaFonte as p
    ) as q 

WHERE q.RowNumber BETWEEN 1 AND 20;


它们都应该返回相同的行,但不是。问题出在哪里?

我想
p.dtdistribicao
的值有一些联系。服务器可以自由选择任何绑定值作为“第一个”,在这种情况下,两个不同的查询可能会给出两个不同的结果

您可以在订单末尾添加一个唯一字段作为平局破坏者。例如,这两个查询应该返回相同的行(假设您有一个名为Id的唯一字段):


你看到了什么不同?一个不同之处是,第一个查询将有一个额外的列,并且您没有指定返回中的行的顺序(例如,ORDER BY q.RowNumber),因此理论上它们可以以任何顺序返回。行是不同的。他们有不同的想法,正是我要写的。这很有道理。。如果您想验证情况是否属实,请将row\u number()更改为densite\u rank()。如果结果查询返回的行数超过20行,那么您将看到它们的确切位置(因为排名函数将为它们返回相同的结果)。
select top 20 * from dbo.ProcessoInstanciaFonte as p order by p.DtDistribuicao
SELECT * 
    FROM 
    (
        SELECT *,
        ROW_NUMBER() OVER (ORDER BY p.DtDistribuicao, p.Id) AS RowNumber
        FROM ProcessoInstanciaFonte as p
    ) AS q     
WHERE q.RowNumber BETWEEN 1 AND 20;
ORDER BY q.RowNumber

SELECT TOP 20 *
FROM dbo.ProcessoInstanciaFonte AS p
ORDER BY p.DtDistribuicao, p.Id