按自定义起始日时分统计每月各状态企业数量(PostgreSQL)
按月份分组统计并指定查询月份的SQL实现
针对你的companies表,要实现按月份拆分结果并通过参数指定查询月份,可以用条件聚合结合日期函数来实现,同时支持参数化查询。
实现思路
- 用
date_trunc('month', created_at)将created_at截断到月份级别,作为分组依据; - 通过
COUNT(CASE ...)的条件聚合方式,分别统计每个月内状态为Active和Blocked的公司数量; - 用
WHERE子句传入参数,精准筛选需要查询的月份。
具体SQL查询
-- 参数化查询,支持指定单个或多个月份 SELECT -- 取该月任意一条记录的时间戳(也可替换为date_trunc生成月初时间) MAX(created_at) AS created_at, COUNT(CASE WHEN status = 'Active' THEN 1 END) AS "Active", COUNT(CASE WHEN status = 'Blocked' THEN 1 END) AS "Blocked" FROM companies -- 筛选指定月份,参数可传入'2023-08'这类年月字符串或timestamp类型值 WHERE date_trunc('month', created_at) IN ( date_trunc('month', $1::timestamp), date_trunc('month', $2::timestamp) -- 如需查询更多月份,继续添加参数即可 ) GROUP BY date_trunc('month', created_at) ORDER BY date_trunc('month', created_at);
补充说明
- 若只需查询单个月份,把
IN子句改成= date_trunc('month', $1::timestamp)即可; - 如果希望
created_at列统一显示当月第一天,可把MAX(created_at)替换为date_trunc('month', created_at)::timestamp,结果会是2023-08-01 00:00:00.000000这类格式; $1、$2是PostgreSQL的参数占位符,实际使用时传入对应月份的日期值即可。
示例结果(指定2023年5、8、12月)
| created_at | Active | Blocked |
|---|---|---|
| 2023-05-07 18:06:56.000000 | 51 | 13 |
| 2023-08-07 18:06:56.000000 | 54 | 32 |
| 2023-12-07 18:06:56.000000 | 35 | 35 |
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

