mysql乘法运算_SQL中的乘法聚合运算符
慕虎7371278MUL是指值的渐进乘法?即使有100个较小的行(例如10s),您的MUL(列)也会溢出任何数据类型!由于滥用/滥用的可能性很高,并且使用范围非常有限,因此不必成为SQL标准。正如其他人所展示的那样,有许多数学方法可以解决该问题,就像有很多方法可以使用标准(和通用)方法在SQL中进行棘手的计算一样。样本数据:Column1248COUNT : 4 items (1 for each
慕虎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值相乘得出真实结果
更多推荐
所有评论(0)