[英]Get count of susbcribers for each month in current year even if count is 0
我需要获取当年每个月的新订阅者数量。
数据库结构: Subscriber(subscriber_id, create_timestamp, ...)
预期结果:
date | count
-----------+------
2021-01-01 | 3
2021-02-01 | 12
2021-03-01 | 0
2021-04-01 | 8
2021-05-01 | 0
我写了以下查询:
SELECT
DATE_TRUNC('month',create_timestamp)
AS create_timestamp,
COUNT(subscriber_id) AS count
FROM subscriber
GROUP BY DATE_TRUNC('month',create_timestamp);
哪个有效,但不包括计数为 0 的月份。它只返回表中存在的月份。 喜欢:
"2021-09-01 00:00:00" 3
"2021-08-01 00:00:00" 9
第一个子查询用于检索按年计算的每个月的行,然后与另一个用于检索按月计算的 total_count 的子查询进行 LEFT JOIN。 COALESCE() 用于将 NULL 值替换为 0。
-- PostgreSQL (v11)
SELECT t.cdate
, COALESCE(p.total_count, 0) total_count
FROM (select generate_series('2021-01-01'::timestamp, '2021-12-15', '1 month') as cdate) t
LEFT JOIN (SELECT DATE_TRUNC('month',create_timestamp) create_timestamp
, SUM(subscriber_id) total_count
FROM subscriber
GROUP BY DATE_TRUNC('month',create_timestamp)) p
ON t.cdate = p.create_timestamp
请从 url https://dbfiddle.uk/?rdbms=postgres_11&fiddle=20dcf6c1784ed0d9c5772f2487bcc221 查看
获取当年每个月的新订阅者数量
SELECT month::date, COALESCE(s.count, 0) AS count
FROM generate_series(date_trunc('year', LOCALTIMESTAMP)
, date_trunc('year', LOCALTIMESTAMP) + interval '11 month'
, interval '1 month') m(month)
LEFT JOIN (
SELECT date_trunc('month', create_timestamp) AS month
, count(*) AS count
FROM subscriber
GROUP BY 1
) s USING (month);
db<> 在这里摆弄
这是假设每一行都是“新订阅者”。 所以count(*)
是最简单和最快的。
看:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.