获得每个月的余额并限制红移
Get each month balance with capping on redshift
我想获取这些记录的每个月余额,每个月初的上限为 500 个积分。
我有点卡住了,因为我认为我不能简单地进行滚动总和,因为客户的最大余额是他的新信用额度的两倍(我在示例中使用 500 作为最大值)。
这是我的数据:
CREATE TABLE table1 as (
SELECT 'A' as customer_id, 250 as new_credits, -62 as debit, 1 as month_nb
UNION ALL
SELECT 'A', 250, -84, 2
UNION ALL
SELECT 'A', 250, -8, 3
UNION ALL
SELECT 'A', 210, -400, 4
UNION ALL
SELECT 'A', 210, -162, 5
UNION ALL
SELECT 'A', 210, 0, 6
)
我希望看到这些结果:
有什么想法吗?谢谢!
我正在添加一个新答案,因为之前的答案已经过时了。我不确定 Redshift 的确切语法是什么(文档似乎没有完全更新),但我的想法是:
with recursive cte as (
select month_nb, customer_id, new_credits, debit, new_credits as starting_balance
from table1
where month_nb = 1
union all
select t1.month_nb, t1.customer_id, t1.new_credits, t1.debit,
least(500, cte.starting_balance + cte.debit + t1.new_credits)
from cte join
table1 t1
on t1.month_nb = cte.month_nb + 1 and t1.customer_id = cte.customer_id
)
select *
from cte;
例如,我不确定是否需要 recursive
关键字。
并且 here 是一个使用 Postgres 的 db<>fiddle。
我想获取这些记录的每个月余额,每个月初的上限为 500 个积分。
我有点卡住了,因为我认为我不能简单地进行滚动总和,因为客户的最大余额是他的新信用额度的两倍(我在示例中使用 500 作为最大值)。
这是我的数据:
CREATE TABLE table1 as (
SELECT 'A' as customer_id, 250 as new_credits, -62 as debit, 1 as month_nb
UNION ALL
SELECT 'A', 250, -84, 2
UNION ALL
SELECT 'A', 250, -8, 3
UNION ALL
SELECT 'A', 210, -400, 4
UNION ALL
SELECT 'A', 210, -162, 5
UNION ALL
SELECT 'A', 210, 0, 6
)
我希望看到这些结果:
有什么想法吗?谢谢!
我正在添加一个新答案,因为之前的答案已经过时了。我不确定 Redshift 的确切语法是什么(文档似乎没有完全更新),但我的想法是:
with recursive cte as (
select month_nb, customer_id, new_credits, debit, new_credits as starting_balance
from table1
where month_nb = 1
union all
select t1.month_nb, t1.customer_id, t1.new_credits, t1.debit,
least(500, cte.starting_balance + cte.debit + t1.new_credits)
from cte join
table1 t1
on t1.month_nb = cte.month_nb + 1 and t1.customer_id = cte.customer_id
)
select *
from cte;
例如,我不确定是否需要 recursive
关键字。
并且 here 是一个使用 Postgres 的 db<>fiddle。