如何在MySQL中按3个月分组合并月度数据并计算平均值
搞定!我来帮你实现把月度数据按每3个月一组合并、取平均值的需求~ 核心是先把字符串格式的月份转成可计算的日期类型,再通过月份序号来划分每3个月的组,下面分几种常见的SQL数据库给你具体实现方案:
通用思路说明
- 先将
Month列的字符串(比如Mar-14)转换为数据库可识别的日期格式 - 根据月份的序号(1=1月,2=2月...)进行分组:用
(月份-1)/3取整,这样1-3月会得到0,4-6月得到1,以此类推,再结合年份就能把每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
相关产品推荐
相关产品推荐

