如何在SQL中对近12个月数据按月分组并统计累计计数
SQL实现方案
从你给出的示例输入输出可以确定统计规则:
- 日期按
YYYY-MM的月份粒度分组 - 返回结果的
count为截止到对应月份的累计总记录数 - 无访谈记录的月份不展示
- 若需要限定「最近12个月」的统计范围,在查询中追加日期过滤条件即可
支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等)
用CTE先统计每个月的新增记录数,再通过窗口函数按月份排序计算累计和,执行效率更高:
-- MySQL 语法示例,其他数据库仅需替换日期格式化函数即可 WITH monthly_new AS ( SELECT DATE_FORMAT(interviewed_on_date, '%Y-%m') AS `date`, COUNT(id) AS new_cnt FROM interviewed -- 开启下方注释即可限定统计最近12个月的数据 -- WHERE interviewed_on_date >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH) GROUP BY DATE_FORMAT(interviewed_on_date, '%Y-%m') ) SELECT `date`, SUM(new_cnt) OVER (ORDER BY `date` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `count` FROM monthly_new ORDER BY `date`;
其他数据库日期格式化替换参考:
- PostgreSQL:将
DATE_FORMAT(interviewed_on_date, '%Y-%m')替换为TO_CHAR(interviewed_on_date, 'YYYY-MM'),日期过滤条件替换为interviewed_on_date >= NOW() - INTERVAL '12 months'- SQL Server:替换为
FORMAT(interviewed_on_date, 'yyyy-MM'),日期过滤条件替换为interviewed_on_date >= DATEADD(MONTH, -12, GETDATE())
不支持窗口函数的旧版本(如MySQL 5.x)
通过关联子查询计算累计值即可,写法兼容所有SQL版本:
SELECT DISTINCT DATE_FORMAT(interviewed_on_date, '%Y-%m') AS `date`, ( SELECT COUNT(id) FROM interviewed i2 WHERE DATE_FORMAT(i2.interviewed_on_date, '%Y-%m') <= DATE_FORMAT(i1.interviewed_on_date, '%Y-%m') -- 若要加最近12个月过滤,在此处追加同样的日期条件即可 ) AS `count` FROM interviewed i1 -- 开启下方注释即可限定统计最近12个月的数据 -- WHERE interviewed_on_date >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH) ORDER BY `date`;
结果验证
用你提供的样例数据执行上述SQL,会返回完全匹配预期的结果:
| date | count |
|---|---|
| 2020-12 | 1 |
| 2021-01 | 3 |
| 2021-02 | 4 |
| 2022-05 | 6 |
内容的提问来源于stack exchange,提问作者RmCs
相关产品推荐
相关产品推荐

