按时间条件分组的 SQL 累积总和

问题描述

我有一个表格,其中包含 dummy_iddate_registereditem_id数量价格,像这样:

dummy_id date_registered item_id 数量 价格 my_cumulative
1 2013-07-01 100 10 34.5 10
2 2013-07-01 145 8 2.3 8
3 2013-07-11 100 20 34.5 30
4 2013-07-23 100 15 34.5 45
5 2013-07-24 145 10 34.5 18

如果我想计算列 my_cumulative ,其中包含 date_registered 每个 item_id 订单的累计总数,我使用以下代码

select dummy_id,date_registered,item_id,quantity,price,sum(quantity) over (partition by item_id order by date_registered) as cumulative
from table t;

而且效果很好。但是,如果我现在想为每一行 my_cumulative 列只计算上个月的订单怎么办? (仅对date_register列小于当前列的行计算数量总和,不超过一个月)

有没有办法在 sql 中做到这一点? (首选 postgresql

解决方法

如果您想要当月的累计数量——我怀疑这正是您想要的,那么请更改 partition by

select dummy_id,date_registered,item_id,quantity,price,sum(quantity) over (partition by item_id,date_trunc('month',date_registered) order by date_registered) as cumulative
from table t;

如果你真的想要最后一个月,那么使用带间隔的范围窗口框架:

select dummy_id,sum(quantity) over (partition by item_id
                           order by date_registered
                           range between interval '1 month' preceding and current row
                          ) as cumulative
from table t;

第一个对我来说似乎更有用。