不确定这是正确的标题。我需要找到cumulative multiplication
就像跑步一样。
搜索论坛并获得了很好的answer。但这不是我的确切答案。
如此修改了我的要求的答案。
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
答案 0 :(得分:1)
你的方法非常合理。顺便说一句,nullif()
中的sum()
很好。虽然仅在else
之后计算then
子句 ,但在聚合期间计算else的组件 - 因此log(0)
将返回错误。
我认为有一些更简单的方法来计算符号,例如:
power(-1, sum(case when column1 < 0 then 1 else 0 end))
或:
(case when sum(case when column1 < 0 then 1 else 0 end) % 2 = 0 then 1 else -1 end)
然而,哪个版本更简单&#34;是一个意见问题。
答案 1 :(得分:1)
这是我在SP中使用的另一种方法:
USE DB
GO
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO
IF(OBJECT_ID('TEMP') IS NOT NULL)
DROP TABLE TEMP
CREATE TABLE TEMP (ID INT, Column1 INT)
INSERT INTO TEMP VALUES
(1,1),
(2,2),
(3,4),
(4,8),
(5,-2)
DECLARE @result TABLE(ID INT, Column1 INT, calc INT)
DECLARE @Calc INT = 1
INSERT INTO @result (ID,Column1)
SELECT ID,Column1 FROM TEMP ORDER BY ID
UPDATE @result SET @Calc = calc = Column1 * @Calc
SELECT * FROM @result
我找到了一个博客,其中比较了解决此类问题的不同方法。检查here。