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

标签 sql postgresql window-functions

我不确定 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/

相关文章:

sql - 插入新表时更新外键

postgresql - ansible postgresql模块创建角色和添加数据库

添加 row_number() 后 Oracle 值会发生变化

postgresql - Postgres 在具有 OVER 子句的查询中报告 "window function call requires an OVER clause"

sql-server - 这是否需要递归 CTE,只是创造性的窗口函数,一个循环?

sql - 在 Oracle SQL 中计算工作日(无函数或过程)

sql - 使用动态 sql 的替代方法

ruby-on-rails - JSON 数据在开发中正确显示,但在生产中显示不正确

ruby-on-rails - rake 数据库 :migrate not creating tables on Google Cloud SQL

sql - 如何避免数据库死锁?