如何在SQL Server 2008中计算累积乘积?

7

我有一个包含两列的表,分别是日期和因子。我想要计算累积乘积,类似于SQL Server 2008中的CUMFACTOR。

请问有没有人能够提供一些替代方案。在此输入图片描述


你的数据中有ROW列吗? - Jodrell
相关问题 - Lukas Eder
3个回答

6
很遗憾,在SQL Server(或大多数其他SQL数据库)中没有PROD()聚合函数或窗口函数。但您可以通过以下方法模拟它:
SELECT Date, Factor, exp(sum(log(Factor)) OVER (ORDER BY Date)) CumFactor
FROM MyTable

你好Lukas,感谢您的快速回复。目前我在使用SQL Server 2008,不幸的是LEAD和LAG函数在这个版本中不可用。那么还有其他的替代方法吗? - Prav
1
@Lukas Eder:两种解决方案都不符合原帖中CumFactor列的值。 - knot22
@knot22:呃,谢谢提示。问题在我的答案被接受后2天被编辑了:( 我会修正我的回答。 - Lukas Eder

1
你可以通过以下方式实现:
SELECT A.ROW
    , A.DATE
    , A.RATE
    , A.RATE * B.RATE AS [CUM RATE]
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY DATE) as ROW, DATE, RATE
    FROM TABLE
) A
LEFT JOIN (
    SELECT ROW_NUMBER() OVER(ORDER BY DATE) as ROW, DATE, RATE
    FROM TABLE
) B
ON A.ROW + 1 = B.ROW

“LEAD/LAG”在2012版本中引入,而排名函数则在2005年引入。 - Ivan Starostin

1
为了计算累积乘积,就像原帖中CumFactor列所显示的那样,以下代码可以完成任务:
--first, load the sample data to a temp table
select *
into #t
from 
(
  values
  ('2/3/2000', 10),
  ('2/4/2000', 20),
  ('2/5/2000', 30),
  ('2/6/2000', 40)
) d ([Date], [Rate]);

--next, calculate cumulative product
select *, CumFactor = cast(exp(sum(log([Rate])) over (order by [Date])) as int) from #t;

这是结果:
enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接