Postgres PL / pgSQL递归计算

时间:2013-07-29 12:29:00

标签: postgresql recursion plpgsql

也许有人可以指出我正确的方向。我遇到了编写PL / pgSQL句子的问题,我需要计算“计算”列,这取决于前一个月的值。

最初我有B列和C列,需要计算“计算”

excel for 4 row中的公式如下所示:=C4/(B4+OFFSET(D4;-1;0))

Row  month          B       C       Calculation
3    2012.02.01     1       15      13,20
4    2012.03.01     6       26      1,32
5    2012.04.01     8       21      2,29
6    2012.05.01     10      31      2,54
7    2012.06.01     11      10      0,72

也许有人有任何想法如何实现这一目标。我知道LAG和LEAD函数,但那些只能引用“实际”列而不是计算本身。

p.s这是样本数据和公式,真正的一个要复杂得多。

我会感谢任何问题/想法

1 个答案:

答案 0 :(得分:1)

我认为你可以使用RECURSIVE CTE

with recursive CTE_R as 
(
    select T.Row, T.month, T.B, T.C, 13.2 as Calculation
    from temp as T
    where T.Row = 3

    union all

    select T.Row, T.month, T.B, T.C, T.C / (T.B + C.Calculation) as Calculation
    from CTE_R as C
        inner join temp as T on T.Row = C.Row + 1
)
select *
from CTE_R

另一种方法是创建自己的custom aggregate SQL FIDDLE EXAMPLE

create function aggr_test_func(decimal(29, 10), int, int)
returns decimal(29, 10)
language SQL as
$func$
    select $3 / ($2     + $1)
$func$;

create aggregate aggr_test (int, int)
(
    sfunc = aggr_test_func,
    stype = decimal(29, 10),
    initcond = 0
);

select *, aggr_test(B, C) over (order by row asc) as Calculation
from test;