我有一个包含以下列的表格:
**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()
很高。
我不知道为什么会这样。
有人能指出我正确的方向吗?
答案 0 :(得分:2)
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
generate_series()
以特定间隔生成日期。在这种情况下,每个月都可以。date_trunc()
计算)。COALESCE()
)