簡體   English   中英

Postgres累積計數隨着時間的推移

[英]Postgres cumulative count over time

我試圖在一個月內找到一個月內活躍訂閱的數量。

表:訂閱字段:

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

在以下情況下,訂閱在特定時間戳中被視為活動:

  1. deletionDate為null
  2. 特定時間戳位於creationDate和deletionDate之間

例:

  • 訂閱A具有creationDate“2014-06-27 11:37:34.205 + 00”和deletionDate“2014-08-01 04:16:34.435 + 00”。 訂閱A在2014年6月,2014年7月和2014年8月被視為有效。
  • 訂閱B有creationDate“2014-06-27 11:37:34.205 + 00”和deletionDate“2014-06-28 11:37:34.205 + 00”。 訂閱B僅在2014年6月有效。
  • 訂閱C有creationDate“2014-06-27 11:37:34.205 + 00”,沒有刪除日期。 認購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

但是,問題在於它包含了上個月的非活動訂閱數。 為了說明我的意思,我的上述查詢似乎包括2014年7月的訂閱B(在上面的示例中)作為有效訂閱。

我不確定如何獲取特定月份的“有效訂閱”以刪除前幾個月不再有效的訂閱數。

謝謝! :)

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM