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

如何在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,会返回完全匹配预期的结果:

datecount
2020-121
2021-013
2021-024
2022-056

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:18:16