随着时间的推移Postgres累积计数

chr*_*g89 3 postgresql timestamp cumulative-sum

我正在尝试查找一个时间表中一个月内的活动订阅数。

表格:订阅字段:

  • ID
  • “创立日期”
  • “ deletionDate”

在以下情况下,订阅被视为在特定时间戳下处于活动状态:

  1. deleteDate为null
  2. 特定的时间戳介于creationDate和deleteDate之间

例:

  • 订阅A具有creationDate“ 2014-06-27 11:37:34.205 + 00”和deleteDate“ 2014-08-01 04:16:34.435 + 00”。订阅A被认为在2014年6月,2014年7月和2014年8月处于活动状态。
  • 订阅B的创建日期为“ 2014-06-27 11:37:34.205 + 00”,而删除日期为“ 2014-06-28 11:37:34.205 + 00”。订阅B仅在2014年6月有效。
  • 订阅C的creationDate为“ 2014-06-27 11:37:34.205 + 00”,没有deleteDate。订阅C被视为有效期为2014年6月,直至当月。

这是我尝试的:

select "Month", sum(sub) over (order by "Month" asc) as "Active subscriptions"
from
(select to_char(subscriptions."creationDate" at time zone '-7', 'YYYY-MM') as "Month", 
    count(distinct subscriptions.id) as sub
    from subscriptions
    where (to_char(subscriptions."deletionDate" at time zone '-7', 'YYYY-MM') is null 
        or to_char(subscriptions."deletionDate" at time zone '-7', 'YYYY-MM') >= to_char(subscriptions."creationDate" at time zone '-7', 'YYYY-MM') )
    group by "Month") as foo
Run Code Online (Sandbox Code Playgroud)

但是,问题在于它包括上个月的非活动订阅数。为了说明我的意思,我的上面的查询似乎包含了订阅B(在上面的示例中)作为2014年7月的有效订阅。

我不确定如何获取特定月份的“有效订阅”以删除前几个月不再有效的订阅数。

谢谢!:)

And*_*rus 5

SELECT m, count(subscriptions.*) 
FROM subscriptions 
JOIN generate_series('2010-01-01'::date, now(), interval '1 mon') AS m
ON m >= subscriptions.creationDate AND 
       (subscriptions.deletionDate IS NULL OR m <= subscriptions.deletionDate)
/* You may get better indexed performance if you use a date 
   far in the future for current
  accounts, instead of NULL. Then you can use BETWEEN */
GROUP BY m ORDER BY m;
Run Code Online (Sandbox Code Playgroud)