如何通过MySQL查询近3个月内每日平均发送邮件数量?
没问题!我来帮你搞定这两个MySQL查询需求,分场景给你详细说明:
1. 查询本月发送的平均邮件数量
这里分两种常见的统计逻辑,你可以根据实际需求选择:
逻辑一:总邮件数除以本月实际天数
这种方式是把本月所有发送的邮件总数,除以本月的总天数(比如30天、31天),得到平均每天的发送量:
SELECT COUNT(*) / DAY(LAST_DAY(CURDATE())) AS monthly_average FROM your_table_name -- 替换成你的实际表名 WHERE DATE_FORMAT(date, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m');
LAST_DAY(CURDATE())会获取本月最后一天的日期,DAY()函数提取该日期的天数,得到本月总天数。DATE_FORMAT(date, '%Y-%m')用来匹配日期列的年份和月份,确保只筛选本月的数据。
逻辑二:每日发送量的平均值(仅统计有发送记录的天数)
如果有些天没有发送邮件,你只想统计有邮件发送的天数的平均量,可以用子查询先按天统计,再求平均值:
SELECT AVG(daily_count) AS daily_average_this_month FROM ( SELECT DATE(date) AS send_date, -- 提取日期部分,按天分组 COUNT(*) AS daily_count FROM your_table_name WHERE DATE_FORMAT(date, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m') GROUP BY DATE(date) ) AS daily_stats;
2. 查询近3个月内的每日平均发送邮件数量
同样分两种情况,默认先给你只统计有发送记录天数的版本,再补充包含空日期的版本:
基础版本(仅统计有邮件的天数)
SELECT AVG(daily_count) AS daily_average_last_3_months FROM ( SELECT DATE(date) AS send_date, COUNT(*) AS daily_count FROM your_table_name WHERE date >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH) -- 筛选近3个月的数据 AND date < CURDATE() -- 排除今天(如果今天还没结束,数据不完整) GROUP BY DATE(date) ) AS daily_stats;
DATE_SUB(CURDATE(), INTERVAL 3 MONTH)获取当前日期往前推3个月的日期,作为筛选的起始点。- 如果需要包含今天的数据,去掉
AND date < CURDATE()即可。
进阶版本(包含无邮件的日期,计数为0)
如果希望把近3个月里没有发送邮件的日期也纳入统计(这些天的计数为0),需要先生成一个连续的日期序列,再和你的邮件表关联:
WITH RECURSIVE date_range AS ( -- 生成近3个月的起始日期 SELECT DATE_SUB(CURDATE(), INTERVAL 3 MONTH) AS send_date UNION ALL -- 递归生成后续的每一天 SELECT DATE_ADD(send_date, INTERVAL 1 DAY) FROM date_range WHERE send_date < CURDATE() ) SELECT AVG(COALESCE(daily_count, 0)) AS daily_average_last_3_months FROM date_range -- 左连接确保所有日期都被保留 LEFT JOIN ( SELECT DATE(date) AS send_date, COUNT(*) AS daily_count FROM your_table_name WHERE date >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH) AND date < CURDATE() GROUP BY DATE(date) ) AS daily_stats ON date_range.send_date = daily_stats.send_date;
WITH RECURSIVE是MySQL 8.0及以上版本支持的递归CTE,用来生成连续日期。COALESCE(daily_count, 0)把没有匹配到的日期的计数替换为0,保证平均值计算准确。
内容的提问来源于stack exchange,提问作者abhishek sansarwal
相关产品推荐
相关产品推荐

