【发布时间】:2017-12-11 16:17:37
【问题描述】:
我不确定 Postgres 是否可以做到这一点,但我希望每一行都计算其窗口函数“框架”。
那么如何在 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: argument of ROWS must not contain variables
【问题讨论】:
-
你也错过了
order by,name的顺序是什么? -
我并不真正关心它们是如何排序的。在这个例子中,我只是好奇如何将行中的值用于动态窗口函数框架。
order by能解决这个问题吗? -
@seanb123 这无助于解决这个问题,不。但是...如果没有它,您的结果将是无稽之谈(假设您在这里破解了变量坚果)。
-
另外,有一列表明您的当前记录与在当前记录之前排序的其他一些记录之间存在关系似乎不是那么好的设计。这表明表中的记录存在一些固有的顺序,而没有。似乎 category_id 或父/子关系在这里更适合对您的记录进行分组。所以你可以
sum(price) .. group by category_id或者在递归 CTE 中做一些数学运算(如果它本质上更分层的话)。也许您可以根据您的样本数据分享您想要的结果 -
请查看Bruce Momjian's presentation它对我有帮助,所以也许它也可以帮助你。
标签: sql postgresql window-functions