gpt4 book ai didi

postgresql - postgres 按行聚合子集

转载 作者:行者123 更新时间:2023-12-04 07:38:44 25 4
gpt4 key购买 nike

我正在尝试评估半年不事件后奖金消耗时的用户忠诚度奖金余额。我希望我的总和包括 ord用户 1 的 4、5 和 6。

create table transactions (
user int,
ord int, -- transaction date replacement
amount int,
lag interval -- after previous transaction
);
insert into transactions values
(1, 1, 10, '1h'::interval),
(1, 2, 10, '.5y'::interval),
(1, 3, 10, '1h'::interval),
(1, 4, 10, '.5y'::interval),
(1, 5, 10, '.1h'::interval),
(1, 6, 10, '.1h'::interval),
(2, 1, 10, '1h'::interval),
(2, 2, 10, '.5y'::interval),
(2, 3, 10, '.1h'::interval),
(2, 4, 10, '.1h'::interval),
(3, 1, 10, '1h'::interval),
;

select user, sum(
amount -- but starting from last '.5y'::interval if any otherwise everything counts
) from transactions group by user
 user | sum(amount)
--------------------
1 | 30 -- (4+5+6), not 50, not 60
2 | 30 -- (2+3+4), not 40
3 | 10

最佳答案

尝试这个:

with cte as(
select *,
case when (lead(lag) over (partition by user_ order by ord)) >= interval '.5 year'
then 1 else 0 end "flag" from test
),
cte1 as (
select *,
case when flag=(lag(flag,1) over (partition by user_ order by ord)) then 0 else 1 end "flag1" from cte
)
select distinct on (user_) user_, sum(amount) over (partition by user_,grp order by ord) from (
select *, sum(flag1) over (partition by user_ order by ord) "grp" from cte1) t1
order by user_ , ord desc
DEMO
虽然它非常复杂和缓慢,但可以解决您的问题

关于postgresql - postgres 按行聚合子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67604467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com