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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:44:15