递归累积总和达到一定值Postgres

问题描述 投票:0回答:1

我的数据看起来像这样:

user_id touchpoint_number   days_difference
1       1                   5
1       2                   20
1       3                   25
1       4                   10
2       1                   2
2       2                   30
2       3                   4

我想创建一个列,它将创建days_difference的累积和,由user_id分区,但每当值达到30并从0开始计数时将重置。我一直试图这样做,但我无法想象它在PostgreSQL中如何做到这一点,因为它必须是递归的。

我希望得到的结果如下:

user_id touchpoint_number   days_difference cum_sum_upto30
1       1                   5               5
1       2                   20              25
1       3                   25              0    --- new count all over again
1       4                   10              10
2       1                   2               2
2       2                   30              0    --- new count all over again
2       3                   4               4

你有什么好主意可以做到这一点吗?

postgresql recursion
1个回答
1
投票

这应该做你想要的:

with cte as (
         select t.a, t.b, t.c, t.c as sumc
         from t
         where b = 1
         union all
         select t.a, t.b, t.c,
                (case when t.c + cte.sumc > 30 then 0 else t.c + cte.sumc end)
         from t join
              cte
              on t.b = cte.b + 1 and t.a = cte.a
        )
select *
from cte
order by a, b;

Here是一个rextester。

© www.soinside.com 2019 - 2024. All rights reserved.