不同于纯数学实数,甚至不同于有理数,浮点数类型不是交换-结合的。这意味着,正如数字编码中通常所知的那样,浮点数列表的顺序会影响浮点和的值。对列表进行排序,以便在相加之前先将较小的数字放在第一位,这是一个好主意。
SQL表是有顺序的。这可以在order-by子句中指定。
SQL引擎是否按order-by子句中给定的顺序对字段求和?
是否可以强制SQL引擎通过按升序对正浮点数列表进行排序,从最小的第一个开始进行累加?
我可以强制引擎先加最大值吗?或者求和的顺序不依赖于表的顺序?或者,求和顺序可能以复杂且不确定的方式与order-by顺序相关?
我认识到这可能取决于SQL引擎的选择。我的核心兴趣是SnowFlake。
发布于 2021-10-17 02:37:13
是的,浮点数是特定于顺序的,是的,Snowflake中的浮点数是受此影响的,他们有一篇文章讨论了排序顺序的不稳定性,以及它对排序方式的影响,这与你的问题相反。
理论上是的,排序子选择将允许控制顺序问题。例如,与MS Sql Server不允许在子选择上进行排序不同,Snowflake允许您这样做。真正的问题是他们是否总是尊重它。我倾向于相信它们不是,因为大多数操作是可并行的,或者其中的求和通常是“安全的”,因此我怀疑您将无法强制遵守顺序。
我的一个想法是,将值写到一个临时表中,在临时表上使用order by,但你会遇到读取的问题,这同样可能会被并行化。您可以使用width_bucket将值分成多个批,然后对这些值求和,然后对和求和。但同样,在块中,您仍然会得到不稳定。
在这一点上,数字稳定性是您最关心的问题,而上面的技巧不能满足您的需要,我将转向NUMBER,并使用更多的小数位形式。
https://stackoverflow.com/questions/69600529
复制相似问题