You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中获取含0计数的每日用户创建量?

获取包含0计数的用户注册日期统计

要显示计数为0的日期,核心思路是先生成完整的日期序列,再将用户表数据左连接到这个序列上,这样没有用户注册的日期也会保留,计数显示为0。以下是具体实现:

完整查询示例

针对你指定的时间范围(2022-01-11 至今),可以用如下查询:

WITH date_series AS (
    SELECT generate_series(
        DATE_TRUNC('day', '2022-01-11'::DATE),
        DATE_TRUNC('day', NOW()),
        INTERVAL '1 day'
    ) AS day
)
SELECT
    ds.day,
    COUNT(u.id) AS signup
FROM date_series ds
LEFT JOIN users u ON DATE_TRUNC('day', u.created_at) = ds.day
GROUP BY ds.day
ORDER BY ds.day;

关键说明

  • generate_series:生成从起始日期到当前日期的每日时间戳序列,确保所有日期都被包含。
  • CTE(WITH子句):将生成的日期序列封装为临时数据集date_series,方便后续关联。
  • LEFT JOIN:以日期序列为主表,左连接用户表,即使某一天没有用户注册,该日期也会保留在结果中。
  • COUNT(u.id):只统计用户表中存在的id(非NULL值),没有数据时会返回0,避免直接用COUNT(*)导致无数据日期计数为1的问题。

简化写法(无需CTE)

如果不需要CTE,也可以直接在FROM子句中使用generate_series:

SELECT
    ds.day,
    COUNT(u.id) AS signup
FROM generate_series(
    DATE_TRUNC('day', '2022-01-11'::DATE),
    DATE_TRUNC('day', NOW()),
    INTERVAL '1 day'
) AS ds(day)
LEFT JOIN users u ON DATE_TRUNC('day', u.created_at) = ds.day
GROUP BY ds.day
ORDER BY ds.day;

为什么之前的查询不生效?

你之前的查询直接从users表分组,只有存在用户注册记录的日期才会出现在结果集中,没有数据的日期自然不会被返回。必须先构造完整的日期范围,再关联用户数据才能得到包含0的统计结果。

内容的提问来源于stack exchange,提问作者Omkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:01:13