首页/数据/数仓建模速查/留存计算的数据准备
维度与事实设计149 条

留存计算的数据准备

留存 = 首日新增用户在第 N 日仍活跃的比例:准备「首日集合」与「活跃日明细」两张表,按自然日关联计算,明确活跃定义。

数仓建模速查数据更新于 2026-10-13

留存需要哪两张表

留存率是新用户在首次行为后的第 N 天仍然活跃的比例,计算需要两张基础表:首日集合表记录每个用户的首次行为日,活跃明细表按日记录活跃用户。关键约束是活跃定义必须统一,登录、下单、浏览三种定义算出的留存差异很大;首日集合也不应被追数改写,否则历史留存曲线会整体位移,看起来像业务发生了突变。

基本信息

首日集合首次行为日,形成 cohort
活跃明细每日活跃用户,可带活跃类型
口径活跃行为定义与去重键
观察点次日、7 日、30 日留存
稳定性首日集合不应被追数改写

典型使用场景

  • 评估获客质量:不同渠道拉来的用户次日留存差异明显
  • 功能上线后对比前后 cohort 的留存曲线,衡量改动效果
  • 标记低质量渠道:留存长期低于基准的渠道需要复核投放
  • 补数后重算 cohort,确认历史曲线是否发生整体位移
  • 统一各业务线的活跃定义,让留存数字跨团队可比
  • 定位留存断点:找出用户在第几天开始集中流失,指导召回策略
  • 首日行为与渠道交叉,看哪种首日行为组合带来更高的长期留存

次日留存

次日留存
-- 首日集合左连次日活跃,分别统计分子分母
WITH first_day AS (
  SELECT user_id, min(dt) AS cohort_dt
  FROM dwd_active_user
  GROUP BY user_id
)
SELECT f.cohort_dt,
       count(DISTINCT f.user_id) AS cohort_uv,
       count(DISTINCT a.user_id) AS d1_uv,
       count(DISTINCT a.user_id) / count(DISTINCT f.user_id) AS d1_retention
FROM first_day f
LEFT JOIN dwd_active_user a
  ON a.user_id = f.user_id AND a.dt = date_add(f.cohort_dt, 1)
GROUP BY f.cohort_dt;

结果读法

要素含义异常信号
cohort_dt用户首次活跃日整体位移说明首日集合被改写
cohort_uv首日新增用户数与注册数差异大说明活跃定义过松
d1_uv次日仍活跃用户数断崖变化提示埋点或任务异常
留存率次日活跃除以首日集合超过百分之百说明关联存在重复
活跃定义不同会让留存差异显著:跨团队对比前先对齐定义,并把定义写进指标卡,避免各说各话、会议上比对不成。
新用户与回流用户要分开统计:把长期未活跃后回来的用户算作新增,会人为抬高留存曲线,掩盖真实的获客质量问题。

易错点

  • 活跃定义含糊,不同报表的留存差异无法解释
  • 补数导致首日集合变化,历史留存曲线被整体改写
  • 把回流用户当新用户,留存率虚高
  • 观察点口径不统一,自然日与滚动 24 小时混用导致跨报表对不上

数据来源与参考

  • 增长分析实践:留存计算
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌