与纯数学实数甚至有理数不同,浮点数类型不具有交换结合性。这意味着,正如数字编码中众所周知的那样,浮点数列表的顺序会影响浮点数和的值。最好对列表进行排序,将较小的数字放在前面,然后再相加。
SQL 表确实有顺序。这可以在 order-by 子句中指定。
SQL 引擎是否按照 order-by 子句中给出的顺序对字段求和?
我可以通过按升序对正浮点数列表进行排序来强制 SQL 引擎从最小的第一个开始相加吗?
我可以强制引擎先累加最大吗?或者求和的顺序不依赖于表的顺序?或者也许求和顺序与排序顺序以复杂且不确定的方式相关?
我认识到这可能取决于 SQL 引擎的选择。我的核心兴趣是 SnowFlake。
[见下面的附录]
最近,我正在检查一个 SQL 脚本,作为检查数据科学过程功能的任务的一部分。我有一份脚本部分的副本,其中有多个子查询,我对其进行了重构,将子查询放在 with 子句的顶部。我通常认为这本质上是语义中立的语法重构操作。然而,脚本的操作发生了变化。
调查表明,这是由于在分区上使用了行号,而分区内的排序不完整。更改代码结构会更改执行计划中的某些内容,从而更改了不完整排序留下的余裕内的顺序。
我记下了这一点,并对这种重构变得不太有信心,尽管我坚持顺序不应该影响语义,至少只要可以避免。
我的问题是...
除了分配行号之外,哪些操作的值会因排序而改变?
我现在意识到这个问题有点太开放了 - 下面的两个答案对我来说都很有用,但我不能选择一个作为正确的答案。我对两者都投了赞成票。谢谢。[我重新考虑了这一点,并且会选择一个答案,而不是没有。我选择的那个更符合目标]。
我还意识到问题的核心是我没有足够强烈地意识到任何重构都可能改变返回行的偶然顺序。从现在开始,如果我重构并且它改变了结果 - 我将寻找排序问题。
我有一个包含多列的数据框,我想以 SQL“选择不同”操作的方式提取唯一的行。到目前为止,每当我查找有关此问题的论坛时,我都会找到有关计算不同值(但我想要实际值)或(更糟糕)的评论,这些值在两列中不同,只是作为一组连接在一起(使用ravel)。我想要的是,例如对于两列,成对不同的值和作为数据框的结果。
我现在正在考虑,最有效的方法可能是自己编写 - 对元组进行稳定排序,然后扫描重复项。任何不比本质上简单的 pandas 表达式都不能回答这个问题。我正在寻找基本或简单的复合操作。
对于那些不知道查询中的“不同”的作用的人......
从...开始
1 2
2 3
1 2
4 5
2 3
2 1
Run Code Online (Sandbox Code Playgroud)
我们回来了
1 2
2 3
4 5
2 1
Run Code Online (Sandbox Code Playgroud)
注意 - 所提出的问题是否应将 (2,1) 和 (1,2) 视为相同。不,因为元组是有序的。再次强调 - 有关详细信息,请参阅 SQL 的行为。