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

如何在MySQL中按3个月分组合并月度数据并计算平均值

搞定!我来帮你实现把月度数据按每3个月一组合并、取平均值的需求~ 核心是先把字符串格式的月份转成可计算的日期类型,再通过月份序号来划分每3个月的组,下面分几种常见的SQL数据库给你具体实现方案:

通用思路说明
  1. 先将Month列的字符串(比如Mar-14)转换为数据库可识别的日期格式
  2. 根据月份的序号(1=1月,2=2月...)进行分组:用(月份-1)/3取整,这样1-3月会得到0,4-6月得到1,以此类推,再结合年份就能把每3个月分成一组
  3. 对每组的value计算平均值,同时生成清晰的分组标识(比如起始月份或者季度编号)

1. MySQL 实现

方案一:用季度编号作为分组标识(如Q1-14)

SELECT
    CONCAT('Q', FLOOR((MONTH(date_month) - 1)/3) + 1, '-', YEAR(date_month)) AS quarter_group,
    AVG(value) AS avg_value
FROM (
    -- 第一步:把字符串月份转成日期
    SELECT
        STR_TO_DATE(Month, '%b-%y') AS date_month,
        value
    FROM your_table_name -- 替换成你的实际表名
) AS converted_data
GROUP BY YEAR(date_month), FLOOR((MONTH(date_month) - 1)/3)
ORDER BY YEAR(date_month), FLOOR((MONTH(date_month) - 1)/3);

方案二:用每组的第一个月份作为标识(如Mar-14、Jun-14)

SELECT
    DATE_FORMAT(MIN(date_month), '%b-%y') AS group_start_month,
    AVG(value) AS avg_value
FROM (
    SELECT
        STR_TO_DATE(Month, '%b-%y') AS date_month,
        value
    FROM your_table_name
) AS converted_data
GROUP BY YEAR(date_month), FLOOR((MONTH(date_month) - 1)/3)
ORDER BY YEAR(date_month), FLOOR((MONTH(date_month) - 1)/3);

2. PostgreSQL 实现

方案一:用起始月份作为分组标识

SELECT
    TO_CHAR(MIN(date_month), 'Mon-YY') AS group_start_month,
    AVG(value) AS avg_value
FROM (
    SELECT
        TO_DATE(Month, 'Mon-YY') AS date_month,
        value
    FROM your_table_name
) AS converted_data
GROUP BY EXTRACT(YEAR FROM date_month), FLOOR((EXTRACT(MONTH FROM date_month) - 1)/3)
ORDER BY EXTRACT(YEAR FROM date_month), FLOOR((EXTRACT(MONTH FROM date_month) - 1)/3);

方案二:用季度编号作为分组标识

SELECT
    CONCAT('Q', FLOOR((EXTRACT(MONTH FROM date_month) - 1)/3) + 1, '-', EXTRACT(YEAR FROM date_month)::TEXT) AS quarter_group,
    AVG(value) AS avg_value
FROM (
    SELECT
        TO_DATE(Month, 'Mon-YY') AS date_month,
        value
    FROM your_table_name
) AS converted_data
GROUP BY EXTRACT(YEAR FROM date_month), FLOOR((EXTRACT(MONTH FROM date_month) - 1)/3)
ORDER BY EXTRACT(YEAR FROM date_month), FLOOR((EXTRACT(MONTH FROM date_month) - 1)/3);

3. SQL Server 实现

SELECT
    FORMAT(MIN(date_month), 'MMM-yy') AS group_start_month,
    AVG(value) AS avg_value
FROM (
    -- 用'01-'拼接月份字符串,转成标准日期(如01-Mar-14)
    SELECT
        TRY_CONVERT(DATE, '01-' + Month, 106) AS date_month,
        value
    FROM your_table_name
) AS converted_data
GROUP BY DATEPART(YEAR, date_month), FLOOR((DATEPART(MONTH, date_month) - 1)/3)
ORDER BY DATEPART(YEAR, date_month), FLOOR((DATEPART(MONTH, date_month) - 1)/3);

注意事项

  • 记得把代码里的your_table_name替换成你的实际表名
  • 如果你的Month列是全拼月份(比如March-14),需要调整日期转换的格式符:MySQL用%M,PostgreSQL用FMMonth,SQL Server用MMMM
  • 如果你的数据起始月份不是季度初(比如从Feb-14开始分组),可以调整分组的偏移量,比如把(月份-1)改成(月份-2),就能从2月开始每3个月一组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:02:18