订阅更新

SQL 怎么统计新增、回流和流失用户?只看当天活跃够吗?

面试问 281 约 3 分钟读完

本文目录
  1. 面试怎么回答
  2. 先问一句:哪种行为才算“来过”?
  3. 新增需要历史,不是两天做减法
  4. 回流和流失,都有一个观察边界
  5. 一个典型场景:报表把老用户当成增长
  6. 让分类互斥,但别假装它覆盖所有人

面试怎么回答

我会先定义活跃行为,再维护可信的首次活跃日和最近活跃日。新增看首次发生日期,回流看过去活跃过且跨过约定沉默期,流失则要在观察时点确认连续未活跃达到阈值。分类应互斥、覆盖明确,历史不完整的用户不能直接当新增。实现时按用户日期去重,用历史基线补足窗口外信息,再做边界样本和人数对账。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

运营拿到一张“新增用户”报表,发现里面有半年前注册的老账号。SQL 没报错,去重也没问题,只是把“昨天没来、今天来了”当成了新增。这道题真正考的是用户生命周期,而不只是两天数据做差集。

用户分类必须结合历史身份、观察窗口和业务阈值;当天活跃只能回答今天来没来。

先问一句:哪种行为才算“来过”?

打开应用、完成登录、观看有效内容、发生支付,都可以是某个指标里的活跃,但不能在同一条用户生命周期里随意替换。

比如统计付费用户回流,用户昨天登录却没支付,不一定会打断付费沉默期。反过来,把登录记录当成购买记录,会让付费回流人数持续偏低。

因此先固定用户标识、有效行为、业务时区和去重粒度。建议先形成“用户—业务日期”活跃明细,一天发生多少条事件都只贡献一个活跃日;事件次数留给另一类指标。

新增需要历史,不是两天做减法

当天活跃集合减去昨天活跃集合,得到的是“今天来、昨天没来”的人,其中同时包含首次出现者和重新出现的老用户。

真正的新增,应由可信的首次活跃日期判断。只扫描最近七天,再对日期取最小值,得到的只是“七天窗口内首次”,不是全生命周期首次。

历史保留不完整怎么办?可以从首日维表、历史用户基线或注册资料补证据,但注册新增与活跃新增仍需分开。实在无法确认,就标识为历史未知,不能为了分类整齐自动归为新客。

回流和流失,都有一个观察边界

假设业务约定连续七个完整自然日未活跃算沉默。某用户最后活跃日为1日,2日至8日都没来,9日回来,才满足这条回流定义。

这里的七天不是“日期差大于等于七”随便一写:9日减1日等于八,中间完整未活跃日才是七。阈值包含不包含当前日,必须用日历样本说清楚。

流失也不是永久事实。到了8日结束时,这名用户可进入“七日未活跃”状态;9日回来后转为回流。历史8日的状态不能因为后来回来而被静默覆盖。

三个分类,依赖的时间证据不同

一个典型场景:报表把老用户当成增长

比如团队只读取昨天和今天的数据,用反关联得到新增人数。活动开始后,“新增”明显上升,于是先怀疑获客渠道效果突然变好。

抽取账号后发现,很多用户以前来过,只是昨天没有访问。根因是查询窗口代替了历史身份。旧验收只检查“新增不大于日活”和用户去重,两条都成立,自然抓不到定义错误。

修复可以保留历史首日表,使用当天活跃回查历史,再按沉默期划分回流。历史首日表自身也需要处理迟到事件:更早的有效行为补进来,首次日期可能前移。

如果报表允许修订,要记录修订日期与规则版本;如果已经对外结算,则需要约定冻结与重述流程,不能让同一份已确认数据悄悄变化。

让分类互斥,但别假装它覆盖所有人

针对当天活跃人群,可以划成新增、回流、其他存量活跃,前提是三者条件互斥,且历史未知另行处理。

流失人群通常来自历史用户基线,不在当天活跃集合里。把“新增+回流+流失”拿去等于日活,集合范围本身就错了。对账前应先画清楚每个分类的母集合。

日更实现也不必每天扫描全部行为。用户首日和最近活跃日可以增量维护,但回补必须支持首日前移、最近日不倒退,以及按历史观察日重建状态。

测试至少放入五种用户:首次来访、连续活跃、刚好达到沉默阈值、差一天达到阈值、历史未知。再加入跨时区和迟到行为,检验结果是否仍符合定义。

这类题的加分点,不是说出更多生命周期名称,而是解释为什么昨天和今天相减不能替代完整用户历史。

刷题进度保存在当前浏览器