MySQL获取上月留存用户数问题(无法汇总唯一用户ID计数)
解决回归用户总数统计问题
嘿,我看你现在的问题是没法正确统计上月有交易行为且本月至今已回归的唯一用户总数对吧?咱们来拆解问题,一步步修正你的代码~
现有代码的核心问题
你的原代码嵌套了多层子查询,但最终只是按用户上月的首次交易日期分组,统计每天的去重用户数,完全没加入「本月至今有交易」的判断逻辑,自然没法得到跨月份回归的用户总数。
正确的SQL写法(两种方案)
核心思路是:找到同时满足上月有交易、本月至今也有交易的唯一用户,然后统计数量(同时保留你原代码里「属于3月MAU用户」的过滤条件)。
方案1:用EXISTS关联本月交易记录
这种写法逻辑清晰,适合中小数据量:
SELECT COUNT(DISTINCT p.user_id) AS returning_users_count FROM purchase p WHERE -- 条件1:上月(2018-04)有交易,且属于3月活跃用户 DATE(p.timestamp) BETWEEN '2018-04-01' AND '2018-04-30' AND p.user_id IN (SELECT user_id FROM analytics_march_mau) -- 条件2:本月至今(2018-05及以后)有交易记录 AND EXISTS ( SELECT 1 FROM purchase p2 WHERE p2.user_id = p.user_id AND DATE(p2.timestamp) >= '2018-05-01' -- 如果需要截止到当前日期,可加上:AND DATE(p2.timestamp) <= CURDATE() );
方案2:用JOIN关联两个月的交易记录
如果数据量较大,JOIN的性能可能更优:
SELECT COUNT(DISTINCT p_apr.user_id) AS returning_users_count FROM purchase p_apr INNER JOIN purchase p_may ON p_apr.user_id = p_may.user_id WHERE -- 上月交易条件 DATE(p_apr.timestamp) BETWEEN '2018-04-01' AND '2018-04-30' AND p_apr.user_id IN (SELECT user_id FROM analytics_march_mau) -- 本月至今交易条件 AND DATE(p_may.timestamp) >= '2018-05-01';
额外优化建议
如果需要动态适配月份(不用每次硬写日期),可以用日期函数自动生成上月和本月的起始日期,比如MySQL里可以这么写:
-- 动态获取上月起始和结束日期 SET @last_month_start = DATE_FORMAT(CURDATE() - INTERVAL 1 MONTH, '%Y-%m-01'); SET @last_month_end = LAST_DAY(CURDATE() - INTERVAL 1 MONTH); -- 动态获取本月起始日期 SET @current_month_start = DATE_FORMAT(CURDATE(), '%Y-%m-01'); SELECT COUNT(DISTINCT p.user_id) AS returning_users_count FROM purchase p WHERE DATE(p.timestamp) BETWEEN @last_month_start AND @last_month_end AND p.user_id IN (SELECT user_id FROM analytics_march_mau) AND EXISTS ( SELECT 1 FROM purchase p2 WHERE p2.user_id = p.user_id AND DATE(p2.timestamp) >= @current_month_start );
内容的提问来源于stack exchange,提问作者Osoba Osaze
相关产品推荐
相关产品推荐

