[英]Getting datas from past months
我有下表(产品表):
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 ........
由于我只看一个月的最后一天,我确保产品在该日期之前开始,并且在该日期之前没有终止日期,并且在该日期期间也没有中断。
我可以在二月或任何其他月份这样做。
但我的goal
是获取一组月份的列表,而不是单个月份。 我想要过去 4 个月内所有有效产品的value
SUM
。
像这样(数字只是例子):
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 日起,该产品被终止
您可以使用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。 我发现很难理解什么是活跃的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.