首页 > 数据库 > SQL > 正文

SQL统计留存率怎么做_用户行为分析SQL思路【指导】

冷漠man
发布: 2025-12-18 21:35:00
原创
940人浏览过
SQL统计留存率的核心是对比初始行为用户与后续某天仍活跃的同一用户,需准确定义活跃行为和首日、统一时间粒度、去重构造基准用户群,并通过JOIN或窗口函数计算各日留存人数及比率。

sql统计留存率怎么做_用户行为分析sql思路【指导】

SQL统计留存率的核心是对比“初始行为用户”和“后续某天仍活跃的同一用户”,关键在准确圈定基准人群、识别回访行为、按时间维度对齐计算。

明确留存定义与时间粒度

留存率 = (第N日仍活跃的首日用户数 ÷ 首日活跃用户总数)× 100%。常见有次日留存、7日留存、30日留存。必须先约定“活跃行为”是什么(如登录、下单、访问首页),以及“首日”如何定义(如首次注册日、首次下单日、某活动参与日)。

  • 若以“注册日”为起点,需确保表中有 user_idregister_date
  • 若以“首次登录日”为起点,需先用窗口函数算出每个用户的 first_login_date
  • 时间粒度统一用日期(DATE(event_time)),避免时分秒干扰分组

构造首日用户集合

用子查询或CTE提取所有在基准日(如2025-12-01)发生目标行为的用户,作为分母基础。例如:

WITH cohort AS (
  SELECT DISTINCT user_id
  FROM event_log
  WHERE DATE(event_time) = '2025-12-01'
    AND event_type = 'login'
)

这一步必须去重,避免同一用户多次行为重复计入分母。

关联后续行为并计算留存

将首日用户集合与后续日期的行为表左连接(或内连接,视是否只统计有回访者),按天聚合回访人数。例如统计次日留存:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 193
查看详情 Find JSON Path Online

SELECT
  COUNT(DISTINCT c.user_id) AS cohort_size,
  COUNT(DISTINCT e.user_id) AS retained_day1,
  ROUND(COUNT(DISTINCT e.user_id) * 100.0 / COUNT(DISTINCT c.user_id), 2) AS retention_day1
FROM cohort c
LEFT JOIN event_log e
  ON c.user_id = e.user_id
    AND DATE(e.event_time) = '2025-12-02'
    AND e.event_type = 'login';

  • LEFT JOIN 保证分母完整;若用 INNER JOIN,则只保留有回访的用户,无法直接算比率
  • 多日留存可扩展:用 DATE_DIFF(ClickHouse/StarRocks)或 DATEDIFF(MySQL)配合 GROUP BY 实现批量计算
  • 高效率场景建议在数仓中预计算用户每日活跃宽表,再做JOIN,避免实时扫描大日志表

用窗口函数支持滚动留存(进阶)

如果要一次性输出每个注册日对应的7日留存曲线,可用窗口函数标记每个用户的首次行为日,再自连接判断间隔:

WITH first_act AS (
  SELECT user_id, MIN(DATE(event_time)) AS first_date
  FROM event_log WHERE event_type = 'login'
  GROUP BY user_id
),
retention_days AS (
  SELECT
    fa.first_date,
    DATEDIFF('day', fa.first_date, DATE(e.event_time)) AS diff_day
  FROM first_act fa
  INNER JOIN event_log e ON fa.user_id = e.user_id
  WHERE DATE(e.event_time) >= fa.first_date
)
SELECT
  first_date,
  COUNT(DISTINCT CASE WHEN diff_day = 0 THEN user_id END) AS day0,
  COUNT(DISTINCT CASE WHEN diff_day = 1 THEN user_id END) AS day1,
  COUNT(DISTINCT CASE WHEN diff_day = 7 THEN user_id END) AS day7
FROM retention_days
GROUP BY first_date;

这种方法适合做趋势分析,但要注意数据量大时需加日期分区过滤,否则性能易下降。

以上就是SQL统计留存率怎么做_用户行为分析SQL思路【指导】的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号