对于每个月,计算具有间隔的条目

Posted

技术标签:

【中文标题】对于每个月,计算具有间隔的条目【英文标题】:for each month, count entries with interval 【发布时间】:2021-08-14 05:29:35 【问题描述】:

我很难创建包含每月持续订阅总和的统计数据

我有表订阅

id | created_at          | cancelled_at
----------------------------------------
 1 | 2020-12-29 13:56:12 | null
 2 | 2021-02-15 01:06:25 | 2021-04-21 19:35:31
 3 | 2021-03-22 02:42:19 | null
 4 | 2021-04-21 19:35:31 | null

统计数据应如下所示:

month   | count
---------------
12/2020 | 1     -- #1
01/2021 | 1     -- #1
02/2021 | 2     -- #1 + #2
03/2021 | 3     -- #1 + #2 + #3
04/2021 | 3     -- #1 + #3 + #4, not #2 since it ends that month
05/2021 | 3     -- #1 + #3 + #4

到目前为止,我能够列出我需要以下统计数据的所有月份:

select generate_series(min, max, '1 month') as "month"
from (
    select date_trunc('month', min(created_at)) as min,
    now() as max
    from subscriptions
) months;

并获得特定月份的正确订阅数量

select sum(
    case 
        when
            make_date(2021, 04, 1) >= date_trunc('month', created_at) 
            and make_date(2021, 04, 1); < date_trunc('month', coalesce(cancelled_at, now() + interval '1 month'))
        then 1
        else 0
    end
) as total
from subscriptions
-- returns 3

但我正在努力将它们结合在一起......OVER(我没有经验)对我有用吗?我找到了Count cumulative total in Postgresql,但情况不同(日期是固定的)......还是以某种方式使用FOR 的函数的正确方法?

【问题讨论】:

【参考方案1】:

您可以使用generate_series() 生成月份,然后使用相关子查询来计算活动:

select yyyymm,
       (select count(*)
        from subscriptions s
        where s.created_at < gs.yyyymm + interval '1 month' and
              (s.cancelled_at > gs.yyyymm + interval '1 month' or s.cancelled_at is null)
       ) as count
from generate_series('2020-12-01'::date, '2021-05-01'::date, interval '1 month'
                    ) gs(yyyymm);

【讨论】:

以上是关于对于每个月,计算具有间隔的条目的主要内容,如果未能解决你的问题,请参考以下文章

使用单个查询获取每个多个日期间隔的条目数

根据 30 秒内的时间间隔删除重复项

查询以选择每小时最新的员工条目

计算有多少列表条目具有以特定char结尾的字符串属性

Pandas-如何添加条目跳过行的列?

在 SQL 或 LINQ 中基于月份计算三个表中的条目