PostgreSQL根据日期汇总值

时间:2019-07-25 12:50:20

标签: sql postgresql aggregate

我有一个包含以下列的表格:

**name** | **start_date** | **termination_date** |  
X1 | 2019-01-01 | NULL  
X2 | 2018-05-01 | 2019-03-01 

我想弄清楚每月有多少人订阅。表示开始日期在X个月之前,而终止日期在X个月之后或为空。
例如。对于'2019-01-01',我希望start_date在'2019-01-01'之前或在'2019-01-01'或Null之后的每一行

我通过以下查询尝试过:

SELECT start_date,
       sum(count(distinct name)) OVER (order by start_date)
from Table
where
    is_active = TRUE
    and (termination_date >= start_date or termination_date is null)
Group by start_date
Order by start_date;

但是,当我手动检查一些结果时,我看到它没有返回正确的值,但是sum()很高。 我不知道为什么会这样。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

demo:db<>fiddle

SELECT
    gs::date,
    COUNT(*)
FROM
    subscription,
    generate_series(                                             -- 1
        date_trunc('month', start_date),                         -- 2
        date_trunc('month', COALESCE(termination_date, now())),  -- 3
        interval '1 month'
    ) gs
GROUP BY gs::date                                                -- 4
ORDER BY 1
  1. generate_series()以特定间隔生成日期。在这种情况下,每个月都可以。
  2. 开始时间是开始月份的第一天(由date_trunc()计算)。
  3. 结尾是终止月份的第一天。如果没有,则采用当天(COALESCE()
  4. 分别对每个记录进行此计算。因此日期可以在以后进行分组。

您当然可以使用to_char()格式化月份:demo

相关问题