【问题标题】:Get count of susbcribers for each month in current year even if count is 0获取当年每个月的订阅者计数,即使计数为 0
【发布时间】:2021-11-18 13:20:40
【问题描述】:

我需要统计当年每个月的新订阅者数量。

数据库结构: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

【问题讨论】:

  • 使用 generate_series 表示年份月份,然后加入您的查询。
  • @RahulBiswas 你能举个例子吗?我对 SQL 没有太多经验
  • 请检查以下查询。
  • count of new subscribers - 定义“新”。同一个subscriber_id可以重复订阅吗?可以有 NULL 值吗?您的查询看起来好像我们只是计算所有行...

标签: sql postgresql left-join aggregate generate-series


【解决方案1】:

第一个子查询用于按年检索每个月的行,然后与另一个用于按月检索 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

请查看网址https://dbfiddle.uk/?rdbms=postgres_11&fiddle=20dcf6c1784ed0d9c5772f2487bcc221

【讨论】:

  • 如果我更改它以匹配我的表的数据它不起作用
  • @rabih 我提供了一个伪代码。请检查您将获得想法的链接。每月订阅计数查询必须放在 LEFT JOIN(您的查询)中并使用确切的列名。
  • 请立即查看。您给定的查询放在此处。
【解决方案2】:

获取当年每个月的新订阅者数量

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小提琴here

假设每一行都是“新订阅者”。所以count(*)是最简单最快的。

见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多