gpt4 book ai didi

sql - 如何使用 Postgres 动态框架的窗口函数中的列值?

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

我不确定 Postgres 是否可行,但我希望每一行都计算其窗口函数“frame”。

那么我如何在 Postgres 的窗口函数中使用当前行的列作为 ROWS 的参数?

例如..

create table items (
id serial primary key, name varchar, price integer, precede_by integer
);

insert into items (name, price, precede_by)
values
('A', 1, 2), ('A', 1, 3),
('B', 1, 1),('B',1, 2), ('B', 1, 1), ('B', 2, 2),
('C', 1, 2), ('C', 1,2), ('C', 1, 2), ('C', 1, 5);

我想使用 precede_by 列中设置的整数值。例如,类似这样的东西。

select name, sum(price) over 
(partition by name rows between precede_by preceding and current row)
from items;

但这行不通。我收到 ERROR: ROWS 的参数不能包含变量

最佳答案

不行,想怎么写窗函数都不行。我相信 CROSS JOIN LATERAL 可以解决问题

with oitems as
(
select *, row_number() over (partition by name order by id) rn from items
)
select *
from oitems i1
cross join lateral
(
select sum(price)
from oitems i2
where i1.name = i2.name and i2.rn >= i1.rn - i1.precede_by and i2.rn <= i1.rn
) t

另一个(可能更优雅)解决方案是使用自连接 GROUP BY

with oitems as
(
select *, row_number() over (partition by name order by id) rn from items
)
select i1.id, i1.name, i1.price, sum(i2.price)
from oitems i1
join oitems i2 on i1.name = i2.name and i2.rn >= i1.rn - i1.precede_by and i2.rn <= i1.rn
group by i1.id, i1.name, i1.price

dbfiddle demo

关于sql - 如何使用 Postgres 动态框架的窗口函数中的列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47757014/

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