MySQL按行逐行累计统计每日新增用户总数问题
解决MySQL每日用户数统计及累计总数计算问题
我来帮你搞定这个累计统计的问题!你遇到的累计结果从200开始、未正确累加的情况,主要是因为没有先按日期分组统计每日用户数,或者未对日期排序导致累计顺序混乱,也可能是变量初始化环节出了问题。
正确的查询语句
这里提供两种可靠的写法,你可以根据自己的MySQL版本选择:
写法1:先初始化变量再查询
SET @running_total = 0; SELECT day_created, daily_count, (@running_total := @running_total + daily_count) AS cumulative_total FROM ( -- 先按日期分组,统计每日新增用户数 SELECT DATE(created_at) AS day_created, COUNT(*) AS daily_count FROM myTable GROUP BY DATE(created_at) -- 必须按日期升序排序,保证累计顺序正确 ORDER BY day_created ASC ) AS daily_stats;
写法2:用CROSS JOIN初始化变量(无需单独执行SET语句)
SELECT day_created, daily_count, (@running_total := @running_total + daily_count) AS cumulative_total FROM ( SELECT DATE(created_at) AS day_created, COUNT(*) AS daily_count FROM myTable GROUP BY DATE(created_at) ORDER BY day_created ASC ) AS daily_stats -- 初始化累计变量为0 CROSS JOIN (SELECT @running_total := 0) AS init;
关键注意点
- 先分组再累计:必须先通过子查询得到每日的用户总数,不能直接在原表上累加——原表的每一行是单个用户,直接累加会把每个用户都算一次,而不是每日的总数。
- 按日期排序:子查询里一定要加
ORDER BY day_created ASC,否则累计会按随机顺序计算,结果完全错误。 - 变量初始化:确保
@running_total初始值为0,如果之前执行过其他使用这个变量的语句,残留值会导致累计从非0开始(比如你遇到的200)。
内容的提问来源于stack exchange,提问作者Simon R
相关产品推荐
相关产品推荐

