我正在玩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上运行。
答案 0 :(得分:3)
它们没有被错误编号 - 您的ORDER BY用于不同的列。虽然它们最终会评估相同的值,但ROW_NUMBER中的ORDER BY不会被视为与查询的ORDER BY同步。
答案 1 :(得分:2)
问题似乎是有效数字。 例如:polygenelubricants在101天内获得22281的声望,而KennyTM在178天内获得了39257的声望。两个RepPerDays的整数部分为220,但多基因润滑剂的信誉/天数的浮动值为220.603 ####,KennyTM的浮动值为220.544 ####。
您应该尝试按声望/天数订购。
答案 2 :(得分:0)
行号是否只是某个包含查询结果的临时表中数据发生的行号?如果是,则结果是任意的,并且通常基于db引擎如何处理查询以及数据在源表中的存在方式相同。
答案 3 :(得分:0)
DENSE_RANK
,RANK
和ROW_NUMBER
如何在该查询中进行比较 - 仍然是不一致的行为?
显然首先分配了ROW_NUMBER(),但是ORDER BY没有指定输出按ROW_NUMBER排序,因此输出可以按任何顺序输出。
这样做:
ORDER BY
RepPerDays DESC, Row_number() OVER(ORDER BY Reputation/Days DESC)
它被命令匹配。