我有下表(产品表):
productid status started terminated break_begin break_end value
1 active 2020-01-01 15
2 terminated 2020-02-04 2020-04-06 10
3 active 2020-01-15 2020-02-15 20-02-29 5
4 paused 2020-02-01 2020-04-15 20-04-30 25
5 terminated 2019-12-31 2020-03-21 20
6 active 2020-04-01 12
因此,如果我想知道哪些产品当前处于活动状态,我将按status
-> status= 'active'
进行过滤
但是,如果我想知道哪些产品在3月的上个月活跃(让我们说3月的最后一天),我就无法再按状态进行过滤。由于产品的状态会随着时间的变化而变化,具体取决于产品是暂停,终止还是什至不启动。
产品在以下情况下处于活动状态:
所以我必须在where clause
中做类似的事情:
where started <= '2020-03-31' AND terminated IS NULL or terminated > '2020-03-31' AND ........
由于我只是在一个月的最后一天看,所以我确保产品在该日期之前启动,并且该日期之前没有终止日期,并且在该日期期间也没有中断。
我可以在2月或任何其他月份进行此操作。
但是我的goal
是要获取一个月列表而不是一个月列表。我希望过去四个月中所有有效产品中SUM
中的value
。
就像这样(数字只是示例):
January February March April
32 47 50 40
我的第一个想法是获取最后一天的月份列表:
generate_series('2020-01-01'::date, NOW(),'1 month')
然后计算每个月的最后一天。
之后,我将在where clause
我不确定这样做是否正确。我已经尝试过了,但是有点卡住了。
Explanation: When a product is active:
产品处于活动状态,直到被终止或产品当前处于中断状态(暂停)
例如,我们用id 2
查看产品
started
-> 2月4日
terminated
-> 4月4日
因此,从2月4日到4月4日,该产品处于活动状态。自4月4日起终止产品
答案 0 :(得分:0)
您可以使用distinct on
获取截至每月最后一天与每个产品关联的行:
select distinct on (gs.date, t.product_id) gs.date + interval '1 month' - interval '1 day' as month,
t.*
from t join
generate_series('2020-01-01'::date, now(), '1 month') gs(dte)
on t.started <= gs.date + interval '1 month' - interval '1 day'
order by gs.date, t.product_id;
这可能会回答您的问题。如果没有,您可以将其用作子查询或CTE。我发现很难理解什么是活跃的。