gpt4 book ai didi

sql - PostgreSQL 函数迭代/作用于具有状态的多行

转载 作者:行者123 更新时间:2023-11-29 11:54:40 25 4
gpt4 key购买 nike

我有一个数据库,其中的列如下所示:

session | order | atype | amt
--------+-------+-------+-----
1 | 0 | ADD | 10
1 | 1 | ADD | 20
1 | 2 | SET | 35
1 | 3 | ADD | 10
2 | 0 | SET | 30
2 | 1 | ADD | 20
2 | 2 | SET | 55

它代表正在发生的 Action 。每个 session 都从 0 开始。ADD 添加一个数量,而 SET 设置它。我想要一个函数来返回 session 的结束值,例如

SELECT session_val(1); --returns 45
SELECT session_val(2); --returns 55

是否可以编写这样的函数/查询?我不知道如何用 SQL 做任何类似迭代的事情,或者它是否可能。

最佳答案

好吧,这算不上漂亮,但它很实用:

select sum(amt) as session_val
from (
select segment,
max(segment) over() as max_segment,
amt
from (
select sum(case when atype = 'SET' then 1 else 0 end)
over(order by "order") as segment,
amt
from command
where session = 2
) x
) x
where segment = max_segment

虽然在 PL/pgsql 中它非常简单:

create function session_val(session int) returns int stable strict
language plpgsql as $$
declare
value int := 0;
rec command%rowtype;
begin
for rec in select * from command where command.session = session_val.session loop
if rec.atype = 'SET' then
value := rec.amt;
elsif rec.atype = 'ADD' then
value := value + rec.amt;
end if;
end loop;
return value;
end $$;

所以我猜你选吧。

关于sql - PostgreSQL 函数迭代/作用于具有状态的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3001550/

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