-- 分母: 注册当日新增; 分子: 第 7 个自然日有任意活跃事件 SELECT ... FROM new_user n LEFT JOIN active_log a ...
同一批 3 月新增用户,A 算出 7 日留存 38%,B 算出 52%,评审会上两个数都被质疑。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,A 按自然日算第 7 天是否活跃,B 按 7 个 24 小时窗口算,跨零点就多算一天。分母一个用注册用户,一个用激活用户。口径只存在各自的 SQL 里。
「统计口径文档」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
处理上按这个顺序:把留存定义写成文档 明确分母、窗口、活跃判定;SQL 落成一个公共模型 两个人引用同一份;文档里附一个手算样例 便于核对;用同一 cohort 重跑 两个结果应完全相同。
改完只确认一件事:两人重算结果都是 38%,文档里的样例数字与 SQL 输出一致。
