问题描述
我有一个表格,其中包含 dummy_id、date_registered、item_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;
第一个对我来说似乎更有用。