获取过去几个月的数据

时间:2020-04-28 20:38:06

标签: sql postgresql generate-series

我有下表(产品表):

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日起终止产品

1 个答案:

答案 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。我发现很难理解什么是活跃的。

相关问题