所以,
问题
我对行乘法有疑问。在 SQL 中,有一个SUM()
函数可以为一组行的某些字段计算总和。我想得到乘法,即表
+------+ | 数据 | +------+ | 2 | | -1 | | 3 | +------+
结果就是2*(-1)*3 = -6
这样。我使用DOUBLE数据类型来存储我的数据值。
我的方法
从学校数学可知log(A x B) = log(A) + log(B)
- 因此可以用来创建所需的表达式,例如:
SELECT
IF(COUNT(IF(SIGN(`col`)=0,1,NULL)),0,
IF(COUNT(IF(SIGN(`col`)<0,1,NULL))%2,-1,1)
*
EXP(SUM(LN(ABS(`col`))))) as product
FROM `test`;
- 在这里你看到了这种方法的弱点 - 因为log(X)
是未定义的X<=0
- 我需要在计算整个表达式之前计算负号。这个 fiddle给出了示例数据和查询。另一个弱点是我们需要找出列值中是否有 0(因为它是一个样本,在实际情况下,我将为具有某些条件的表行的某些子集选择产品 - 即我不能简单地从我的表中删除 0-s,因为结果零产品是某些行子集的有效且预期的结果)
细节
现在,最后,我的问题主要部分是:当我们有这样的表达式时如何处理情况:X*Y*Z
and here X < MAXF
, Y<MAXF
, but X*Y>MAXF
and X*Y*Z<MAXF
- 所以我们可能有数据类型溢出(这里MAXF
是双MySQL 数据类型的限制)。样品在这里。上面的查询运行良好,但我可以始终确定它会正确处理吗?即当某些子产品导致溢出时,可能还有另一种溢出问题的情况,但整个产品都可以(没有溢出)。
或者可能有另一种方法来查找行产品?此外,在表中可能有数百万条记录(-1.1<X<=1.1
主要是,但可能具有诸如 100 或 1000 之类的值 - 即如果我们遇到我上面描述的问题,如果乘以某个数量,高到足以溢出DOUBLE ) - 可能正在计算vialog
会很慢吗?