【问题标题】:Interesting Row_Number() bug有趣的 Row_Number() 错误
【发布时间】:2010-06-10 16:51:45
【问题描述】:

我正在使用Stack Exchange Data Explorer 并运行此查询:
https://data.stackexchange.com/stackoverflow/query/2820/rising-stars-top-50-users-ordered-on-rep-per-day

请注意,在结果中,第 11 行和第 12 行具有相同的值,因此编号错误,即使 row_number() 函数采用与查询相同的参数顺序。

我知道这里的正确解决方法是在 order by 子句中指定一个额外的 tie-breaker 列,但我更好奇 row_number() 函数为什么/如何在相同数据上返回不同的结果?

如果它在任何地方都产生影响,它可以在 Azure 上运行。

【问题讨论】:

    标签: sql sql-server tsql row-number analytic-functions


    【解决方案1】:

    它们没有编号错误 - 您的 ORDER BY 用于不同的列。尽管它们最终评估相同的值,但 ROW_NUMBER 中的 ORDER BY 不会被视为与查询的 ORDER BY 同步。

    【讨论】:

    • 是的。如果您想按 row_number() 中的顺序排序,请先在子查询(或 CTE)中投影 row_number,然后按投影的 row_number 排序
    【解决方案2】:

    问题似乎与有效数字有关。 例如:polygenelubricants 在 101 天内获得了 22281 的声誉,而 KennyTM 在 178 天内获得了 39257 的声誉。 RepPerDays 的整数部分都是 220,但多基因润滑剂的 ​​Reputation/Days 浮动值是 220.603####,而 KennyTM 是 220.544####。

    您应该尝试两次都按信誉/天数排序。

    【讨论】:

      【解决方案3】:

      行号是否只是数据发生在保存查询结果的某个临时表中所在的行号?如果是这样,那么结果是任意的,并且通常是相同的,这取决于数据库引擎如何处理查询以及数据在源表中的存在方式。

      【讨论】:

        【解决方案4】:

        DENSE_RANKRANKROW_NUMBER 在该查询中如何比较 - 仍然不一致的行为?

        显然ROW_NUMBER()是先赋值的,但是ORDER BY并没有指定输出按ROW_NUMBER排序,所以输出可以任意顺序输出。

        这样做:

        ORDER BY
        RepPerDays DESC, Row_number() OVER(ORDER BY Reputation/Days DESC)​
        

        并且它被命令匹配。

        【讨论】:

        • 嗯,它确实匹配,但仍然不正常。我必须将其转换为浮点数才能正确。在这一点上,只需使用原始的“Reputation/Days”表达式并将其转换为一个操作数就更简单了。
        猜你喜欢
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多