不确定这个标题是否正确。我需要找到cumulative multiplication
就像跑步总计一样。
搜索了一下论坛,得到了很好的结果answer https://stackoverflow.com/questions/5416169/mutiplication-aggregate-operator-in-sql。但这对我来说不是确切的答案。
所以修改了我的要求的答案。
SELECT *,
(SELECT CASE
WHEN Min(Abs(Column1)) = 0 THEN 0
ELSE Exp(Sum(Log(Abs(NULLIF(Column1, 0))))) -- the base mathematics
* Round(0.5 - Count(NULLIF(Sign(Sign(Column1) + 0.5), 1))%2, 0) -- pairs up negatives
END
FROM TEMP a
WHERE B.ID >= A.ID) as Running_Mul
FROM TEMP B
我得到了答案。现在有没有更好的方法来做到这一点Sql Server 2008
?
样本数据:
ID Column1
-- -------
1 1
2 2
3 4
4 8
5 -2
预期结果:
ID Column1 Running_Mul
-- ------- -----------
1 1 1
2 2 2
3 4 8
4 8 64
5 -2 -128
sql小提琴 http://sqlfiddle.com/#!3/997fe/2
你的方法还是蛮合理的。很好的捕捉nullif()
in the sum()
, 顺便一提。虽然else
clause is仅在之后计算then
, else 的组成部分是在聚合期间计算的 - 所以log(0)
会返回一个错误。
我认为有一些更简单的方法来计算符号,例如:
power(-1, sum(case when column1 < 0 then 1 else 0 end))
or:
(case when sum(case when column1 < 0 then 1 else 0 end) % 2 = 0 then 1 else -1 end)
然而,哪个版本“更简单”则是见仁见智的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)