与纯数学实数甚至有理数不同,浮点数类型不是交换结合的。这意味着,正如在数字编码中众所周知的那样,浮点数列表的顺序会影响浮点和的值。对列表进行排序是一个好主意,在相加之前先把较小的数字放在前面。
一个SQL表有一个顺序。这可以在order-by子句中指定。
SQL引擎是否按照order-by子句中给出的顺序对字段求和?
我可以通过对正浮点数列表按升序排序来强制SQL引擎从最小的数开始相加吗?
我可以强制引擎先加最大值吗?或者求和的顺序与表的顺序无关?或者求和顺序与逐次顺序的关系是复杂而不确定的?
我认识到这可能取决于SQL引擎的选择。我的核心兴趣是雪花。
是的,浮点数是顺序特定的,是的,雪花中的浮点数受到此影响,他们在某处有一篇文章讨论排序顺序的不稳定性以及它对order - by之类的影响,这与你的问题相反。
理论上是的,排序子选择将允许控制顺序问题。不像MS Sql Server不允许在子选择上使用ORDER-BY, Snowflake允许你这样做。真正的问题是他们是否总是尊重它。我倾向于认为它们不会,因为大多数操作都是可并行的,或者求和通常是"安全的",因此我怀疑你不能强迫顺序被尊重。
我有一个想法,我认为是可行的,是把值写到一个临时表中,顺序是这样的,但是你会遇到读取的问题,它同样可能被并行化。您可以width_bucket将这些值分成几批,然后对它们求和,然后再求和。但是在块中你仍然会得到不稳定性。
在这一点上,数字稳定性是你最关心的,上面的hack不能满足你的需要,我将切换到NUMBER并使用更小数位的形式。