基于状态统计用户数量的PostgreSQL查询实现
正确实现PostgreSQL用户状态统计查询
原查询存在的问题
- 分组逻辑错误:GROUP BY包含
id,导致每个用户单独成组,无法实现按日期的汇总统计 - 统计逻辑无效:
COUNT(*)未区分status值,因此enabled和disabled列会显示相同数值,无法体现不同状态的用户数量 - 日期范围处理不严谨:使用
BETWEEN可能遗漏8月最后一天中晚于结束时间戳的记录,建议采用更精准的日期筛选方式
按日期统计8月份每日用户状态数量
如果需要按天汇总8月份每天的启用/禁用用户数,可通过条件聚合实现:
SELECT DATE(created_at) AS date, -- 统计当天enabled状态的用户数 COUNT(CASE WHEN status = 'enabled' THEN 1 END) AS enabled_count, -- 统计当天disabled状态的用户数 COUNT(CASE WHEN status = 'disabled' THEN 1 END) AS disabled_count, -- 统计当天总用户数 COUNT(*) AS total_users FROM users -- 筛选8月份数据(以2023年为例,可按需修改年份) WHERE created_at >= '2023-08-01' AND created_at < '2023-09-01' GROUP BY DATE(created_at) ORDER BY date;
统计8月份用户状态总数量
如果只需要整个8月份的启用/禁用用户总数,去掉分组逻辑即可:
SELECT COUNT(CASE WHEN status = 'enabled' THEN 1 END) AS enabled_total, COUNT(CASE WHEN status = 'disabled' THEN 1 END) AS disabled_total, COUNT(*) AS total_users FROM users WHERE created_at >= '2023-08-01' AND created_at < '2023-09-01';
补充说明
- 条件聚合逻辑:
CASE WHEN匹配符合条件的行,COUNT会忽略NULL值,因此只会统计对应状态的有效用户数 - 日期范围采用
>= 月初 AND < 下月初的写法,可精准覆盖整个月份的所有时间戳,避免因时间精度问题遗漏数据
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

