Mysql 总工程师!我能想象的唯一的性能改进来自于预先计算十进制类型的日志(无论如何,这可能足够快,所以必须进行测试),否则整个事情仍然是IO限制的,所有这些都只是过早的优化。哦,天哪,我真傻。是的,对数可以是任意值。更正。向上投票,因为这是另一种方式(然而,这不是
Mysql 总工程师!我能想象的唯一的性能改进来自于预先计算十进制类型的日志(无论如何,这可能足够快,所以必须进行测试),否则整个事情仍然是IO限制的,所有这些都只是过早的优化。哦,天哪,我真傻。是的,对数可以是任意值。更正。向上投票,因为这是另一种方式(然而,这不是,mysql,sql,Mysql,Sql,总工程师!我能想象的唯一的性能改进来自于预先计算十进制类型的日志(无论如何,这可能足够快,所以必须进行测试),否则整个事情仍然是IO限制的,所有这些都只是过早的优化。哦,天哪,我真傻。是的,对数可以是任意值。更正。向上投票,因为这是另一种方式(然而,这不是一个完整的答案,但无论如何感谢您的时间)似乎非常简单!但是,0存在问题。我觉得这可以简化,使用相同的思想:SELECT EXP(SUM(LOG(data))*(-0.5+MOD(COUNT(data
总工程师!我能想象的唯一的性能改进来自于预先计算十进制类型的日志(无论如何,这可能足够快,所以必须进行测试),否则整个事情仍然是IO限制的,所有这些都只是过早的优化。哦,天哪,我真傻。是的,对数可以是任意值。更正。向上投票,因为这是另一种方式(然而,这不是一个完整的答案,但无论如何感谢您的时间)似乎非常简单!但是,0存在问题。我觉得这可以简化,使用相同的思想:
SELECT EXP(SUM(LOG(data))*(-0.5+MOD(COUNT(data<0),2))*2)x从我的表中
这样您就不需要IF,并且(-0.5+MOD(COUNT(data<0),2))*2
应该是1或-1。对于0值,从触发此查询的应用程序中发出select会更快,因为如果所有数据中至少有一个0,则无论其他所有数字如何,结果都为0。(ABS是个错误,我把它从评论中删除了…)是的,我想佩特卡可能已经破解了它!(假设这确实是处理零的方式)
+------+
| data |
+------+
| 2 |
| -1 |
| 3 |
+------+
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`;
SELECT
CASE WHEN EXISTS (SELECT 1 FROM test WHERE <condition> AND datasign = 0)
THEN 0
ELSE (SELECT 1-2*(SUM(datasign=-1)%2) FROM test WHERE <condition>)
END AS resultsign,
CASE WHEN EXISTS (SELECT 1 FROM test WHERE <condition> AND datasign = 0)
THEN -1 -- undefined log for result 0
ELSE (SELECT SUM(datalog) FROM test WHERE <condition> AND datasign <> 0)
END AS resultlog
;
SELECT IF(MOD(COUNT(data < 0),2)=1
, EXP(SUM(LOG(data)))*-1
, EXP(SUM(LOG(data))))
x
FROM my_table;