c8cd64f6466d544a0f763fec6ea16e6c.png

慕虎7371278

MUL是指值的渐进乘法?即使有100个较小的行(例如10s),您的MUL(列)也会溢出任何数据类型!由于滥用/滥用的可能性很高,并且使用范围非常有限,因此不必成为SQL标准。正如其他人所展示的那样,有许多数学方法可以解决该问题,就像有很多方法可以使用标准(和通用)方法在SQL中进行棘手的计算一样。样本数据:Column1248COUNT : 4 items (1 for each non-null)SUM   : 1 + 2 + 4 + 8 = 15AVG   : 3.75 (SUM/COUNT)MUL   : 1 x 2 x 4 x 8 ? ( =64 )为了完整起见,Oracle,MSSQL,MySQL核心实现*Oracle : EXP(SUM(LN(column)))   or  POWER(N,SUM(LOG(column, N)))MSSQL  : EXP(SUM(LOG(column)))  or  POWER(N,SUM(LOG(column)/LOG(N)))MySQL  : EXP(SUM(LOG(column)))  or  POW(N,SUM(LOG(N,column)))注意在SQL Server中使用EXP / LOG时,请注意返回类型http://msdn.microsoft.com/zh-cn/library/ms187592.aspxPOWER表单允许使用更大的数字(使用比Euler的数字大的基数),并且如果结果增长太大而无法使用POWER将其返回,则可以只返回对数值并在SQL查询之外计算实际数字* LOG(0)和LOG(-ve)未定义。下面仅显示如何在SQL Server中处理此问题。可以使用相同的概念找到其他SQL风格的等效项create table MUL(data int)insert MUL select 1 yourColumn union all           select 2 union all           select 4 union all           select 8 union all           select -2 union all           select 0select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE       EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics     * round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives       ENDfrom MUL配料:取数据的abs(),如果最小值为0,再乘以其他无用的结果,则结果为0当数据为0时,NULLIF将其转换为null。abs(),log()均返回null,从而使它从sum()中被排除如果数据不为0,则abs允许我们使用LOG方法将一个负数乘以-我们将跟踪其他地方的负数制定最终的征兆签(数据)返回1 for >0,0 for 0和-1 for <0。我们再加上0.5并再次使用sign(),因此现在将0和1都归为1,而只有-1归为-1。再次使用NULLIF从COUNT()中删除1,因为我们只需要计算负数。% 2 对负数的count()返回->如果负数为奇数则为1->如果负数为偶数则为0更多数学技巧:我们将0.5取1或0,这样上面就变成->(0.5-1=-0.5=>舍入为-1)如果有奇数个负数->(0.5-0= 0.5=>舍入为 1)如果有偶数个负数我们将最终的1 / -1与SUM-PRODUCT值相乘得出真实结果

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐