繁体   English   中英

获取过去几个月的数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM