3 月 1 日次日留存显示 62.4%,按新增用户重算只有 28.7%,两个数都发过周报。乍看像缓存或者权限的锅,追下去往往不是。

SELECT COUNT(DISTINCT user_id) FROM user WHERE first_active_date = '2026-03-01';
SELECT COUNT(DISTINCT a.user_id) / COUNT(DISTINCT n.user_id)
FROM new_user n LEFT JOIN active_log a ON a.user_id=n.user_id AND a.dt='2026-03-02'
WHERE n.first_active_date='2026-03-01';

追下去是这么回事:分母取了当天全部活跃用户,包含大量老用户,留存自然被拉高。分子只统计了次日仍活跃的新用户,两边不是同一批人。留存定义里没写分母是新增。

「留存率分母」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。

具体做法是,分母锁定为当天首次活跃的新用户;分子按同一批用户次日是否活跃统计;把 cohort 日期和注册日期分开存;用 2 月 28 日到 3 月 3 日四个 cohort 各算一遍。

验收就看一点,3 月 1 日次日留存显示 28.7%,与 cohort 明细逐日相加一致。

作者 9823189