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

MySQL按多日期分组:统计小于各日期的记录数优化需求

高效解决MySQL多日期累计统计问题

嘿,这个反复执行单日期查询的痛点我太懂了,完全没必要这么折腾!给你几个更高效的方案,根据你的MySQL版本和实际需求来选:

方案1:用窗口函数(MySQL 8.0+ 推荐)

如果你的MySQL是8.0及以上版本,窗口函数是最简洁高效的方式,尤其适合统计所有存在的created_at日期的累计记录数:

SELECT 
    created_at AS target_date,
    COUNT(*) OVER (ORDER BY created_at) AS cumulative_count
FROM users
GROUP BY created_at
ORDER BY target_date;

这个查询会先按日期分组,然后通过COUNT(*) OVER (ORDER BY created_at)自动计算从最早日期到当前日期的累计记录数,一次查询就能拿到所有日期的结果。

方案2:针对指定日期列表(支持所有MySQL版本)

如果是你有固定的几个目标日期(比如你说的10个特定日期),可以先把这些日期构建成临时数据集,再关联用户表统计:

方式A:用CTE(MySQL 8.0+)

WITH target_dates AS (
    SELECT '2016-01-01' AS date UNION ALL
    SELECT '2016-02-01' UNION ALL
    SELECT '2016-03-01' -- 这里继续添加你的目标日期
)
SELECT 
    td.date,
    COUNT(u.id) AS cumulative_count
FROM target_dates td
LEFT JOIN users u ON u.created_at <= td.date
GROUP BY td.date
ORDER BY td.date;

方式B:兼容低版本MySQL(无CTE支持)

如果你的MySQL版本低于8.0,用子查询构建临时日期表就行:

SELECT 
    td.date,
    (SELECT COUNT(*) FROM users WHERE created_at <= td.date) AS cumulative_count
FROM (
    SELECT '2016-01-01' AS date UNION ALL
    SELECT '2016-02-01' UNION ALL
    SELECT '2016-03-01' -- 继续添加目标日期
) td
ORDER BY td.date;

这两种方式都是一次查询搞定所有日期的统计,比循环执行N次查询高效太多,减少了连接开销。

关键优化建议

一定要给created_at字段加索引,不管用哪种方案,都能大幅提升查询速度:

CREATE INDEX idx_users_created_at ON users(created_at);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:00:17