2016-03-01 86 views
4

我有2列以下的表格,日期&因子。我想计算累积产品,就像SQL Server 2008中的CUMFACTOR一样。如何计算SQL Server 2008中的累积产品?

有人可以给我建议一些选择。 enter image description here

+0

你的数据中是否有ROW列? – Jodrell

+0

[相关问题](http://stackoverflow.com/q/3912204/521799) –

回答

1

不幸的是,在SQL Server(或其他大多数SQL数据库)中没有PROD()聚合或窗口函数。但是你可以模仿它是这样:

SELECT Date, Factor, exp(sum(log(Factor)) OVER (ORDER BY Date)) CumFactor 
FROM MyTable 
+0

你好Lukas,谢谢你的快速回复。目前我在SQL Server 2008中,不幸的是LEAD和LAG函数在这个版本中不可用。那么还有其他的选择? – Prav

+1

@Lukas Eder:两种解决方案都不匹配OP的CumFactor列中的值。 – knot22

+0

@ knot22:恩,谢谢你的提示。这个问题在我的答案被接受后2天进行了编辑:(将解决我的答案 –

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 
+0

在2005年版本中引入了“LEAD/LAG”,同时在2005年进行了排名功能。 –

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