今天我们来分享一个常见案例,用SQL来计算用户留存率。

目录:

  • 1. 案例数据

  • 2. 思路分析

  • 3. 完整代码

1. 案例数据

这里我们一共两份日志数据,分别是用户账号创建的日志以及用户登录的日志。

账号创建日志

账号创建日志

用户登录日志

登录日志

2. 思路分析

所谓留存,就是指某日创建的账号在后续自然日登录的比例,比如3月1日新增账号创建数为100,在3月2日这部分用户登录数为51,那么3月1日新增用户的次日留存率为51/100=51%。

注意:我这里用的MYSQL环境

基于上述的理解,我们大概就有了以下思路:

  • 考虑到用户每天登录的次数不一定只有一次,为了方面后续的数据处理,可以先对登录数据按照日期和用户id进行去重DISTINCT处理

SELECT DISTINCTSTR_TO_DATE( $part_date, '%Y-%m-%d' ) login_date,role_id
FROMrole_login
  • 为了计算某条登录日志是该用户创建账号后的第几天登录,我们可以用用户登录日志和账号创建日志进行inner join(这里考虑到不在统计周期内的创建账号的用户数据也会记录在用户登录日志里,所以去掉)

SELECTlogin_log.role_id,create_date,login_date
FROM((SELECT DISTINCTSTR_TO_DATE( $part_date, '%Y-%m-%d' ) login_date,role_id FROMrole_login ) login_logINNER JOIN ( SELECT DISTINCT STR_TO_DATE( $part_date, '%Y-%m-%d' ) create_date, role_id FROM role_create ) create_log ON ( login_log.role_id = create_log.role_id ))

  • 然后用登录日期字段和创建账户字段进行差值DATEDIFF获取第几天登录

SELECTlogin_log.role_id,create_date,DATEDIFF( login_date, create_date ) day_diff
FROM
...

  • 对于第0天登录的数据则可以理解为新增用户数,第N(≥1)天登录的数据则为这批新增用户后续有登录的用户数

SELECTcreate_date
, count((CASE WHEN (day_diff = 0) THEN role_id END)) 新增用户数
, count((CASE WHEN (day_diff = 1) THEN role_id END)) 次日留存
, count((CASE WHEN (day_diff = 2) THEN role_id END)) 3日留存
, count((CASE WHEN (day_diff = 7) THEN role_id END)) 7日留存
FROM
temp_1
GROUP BYcreate_date

  • 用第N天登录的数据 / 新增用户数  就是对应第N天留存率

3. 完整代码

SELECTcreate_date
, 新增用户数
, concat(CAST(ROUND((100 * 次日留存) / 新增用户数,2) AS char), '%') 次日留存率
, concat(CAST(ROUND((100 * 3日留存) / 新增用户数,2) AS char), '%') 3日留存率
, concat(CAST(ROUND((100 * 7日留存) / 新增用户数,2) AS char), '%') 7日留存率
FROM(SELECTcreate_date, count((CASE WHEN (day_diff = 0) THEN role_id END)) 新增用户数, count((CASE WHEN (day_diff = 1) THEN role_id END)) 次日留存, count((CASE WHEN (day_diff = 2) THEN role_id END)) 3日留存, count((CASE WHEN (day_diff = 7) THEN role_id END)) 7日留存FROM(SELECTlogin_log.role_id, create_date, DATEDIFF(login_date, create_date) day_diffFROM((SELECT DISTINCTSTR_TO_DATE($part_date, '%Y-%m-%d') login_date, role_idFROMrole_login)  login_logINNER JOIN (SELECT DISTINCTSTR_TO_DATE($part_date, '%Y-%m-%d') create_date, role_idFROMrole_create)  create_log ON (login_log.role_id = create_log.role_id)))  temp_1GROUP BY create_date
)  temp_2
ORDER BY create_date ASC

以上就是本次全部内容,由于不同的sql环境语法存在些许差异,大家视情况而处理吧。

END -

对比Excel系列图书累积销量达15w册,让你轻松掌握数据分析技能,可以在全网搜索书名进行了解选购:

用SQL进行用户留存率计算相关推荐

  1. mysql 用户留存率计算(每日新增DNU,次日留存率,3日留存率,7日留存率)

    我是先学习了这位大神留存率的写法,然后我自己完善了一下.@阿柯@ 首先声明一下留存的概念 次日留存:1月1日注册的新用户,在1月2日登陆了app.即登陆日期 - 注册日期 = 1天. 3日留存:1月1 ...

  2. redis实现用户签到,统计活跃用户,用户在线状态,用户留存率

    开发的过程中,可能会遇到用户签到.统计当天的活跃用户.以及每个用户的在线状态,用户留存率的开发需求,可能会用传统的方法,根据相应的需求设计数据库表等,但这样耗费的存储空间大,以及性能方面也不会太好,下 ...

  3. 【SQL屠夫系列】- 高频面试之SQL计算用户留存率

    文章目录 指标背景 指标计算 真题 思路 开撸 拓展 在如今的程序员面试过程中,考察SQL部分能力,虽不是难点,但几乎是必考. 为检查思路盲点,避免翻船,各位看官也可以复盘下,如对你有一丝的帮助,欢迎 ...

  4. hive 关于用户留存率的计算

    最近接到一个需求,需要统计用户留存率,而且要一次统计多个模块,多个日期的留存率,那如何通过一段hive(SQL)来实现该需求呢,在网上看到一篇很精妙的文章,参考这篇文章实现了需求,可以说是目前见过的一 ...

  5. 一个SQL,程序实现多日留存率计算

    留存率是衡量用户质量的最重要指标之一,因此计算用户留存率是用户数据分析中必须掌握的技能之一. 留存率指标中,通常需要关注次日留存.3日留存.7日留存和月留存.对新增用户而言,需要关注更细颗粒度的数据, ...

  6. Excel 利用同期群分析计算新用户留存率

    业务分析方法中常用的有同期群分析,本文使用Excel和MySQL,结合同期群计算新注册用户的留存率,并放在实际的应用场景中进行分析. 一.简单介绍同期群分析 1.同期群分析(cohort analys ...

  7. php计算用户留存,利用Python计算新增用户留存率

    原始数据:创角日志和登录日志 导入需要的库 pandas import pandas as pd 1.获取数据 #读取创角日志 df_create = pd.read_csv(r'F:\Python\ ...

  8. app运营:用户留存率详解与计算案例

    摘要: 文/BLUES留存率,越来越受到大家的关注,从网站用户到客户端产品,游戏产品,无线APP产品,都非常重视这一指标,留存率成为衡量一个产品是否健康成长的重要指标之一.留存率的"40–2 ...

  9. 如何高效计算用户留存率

    如何高效计算用户留存率 简单介绍留存率的概念,说明数仓建设中对留存率计算的优化思路 什么是留存率 在互联网行业中,用户在某段时间内开始使用应用,经过一段时间后,仍然继续使用该应用的用户,被认作是留存用 ...

最新文章

  1. Python笔记:字典的fromkeys方法创建的初始value同内存地址问题
  2. bash . dot using
  3. Linux C编程--打开和关闭流
  4. UA MATH566 统计理论 QE练习题2.2
  5. python elasticsearch 入门教程(一)
  6. S/4HANA key user tool创建的Extension field,点了publish后的执行原理
  7. 7-26 单词长度 (15 分) python实现
  8. POJ-1149(网络流)
  9. img标签绝对位置定位,图片显示在签名之上。
  10. bledner做MMD心得(二)
  11. ZYNQ EMMC/FLASH/SD卡硬件性能测试
  12. cesium天气(晴、雨、雪、雾)
  13. django-mysql 中的金钱计算事务处理
  14. 基于Google Edge TPU的Coral USB加速棒体验
  15. php卡死代码,服务器被php进程卡死问题排查-php5.2的curl-bug
  16. Docker笔记-常用命令
  17. 康乃德生物拟最高募资1.8亿美元:产品尚未上市,累计亏损11亿元
  18. Python分析《权力的游戏》最终季...... | 附源码
  19. vivo便签批量导出为excel/记事本/word
  20. 12.15 Daily Scrum

热门文章

  1. 十种排序算法的java汇总
  2. 谷歌浏览器打开标签会把之前的覆盖掉_Chrome 浏览器新更新解决了本地文件拖入导致的标签页意外关闭问题...
  3. python 配置文件对比_difflib模块对比apache配置文件差异
  4. c++调用cplex求解例子_Java调用cplex求解运输问题
  5. win下 cmd 查询本机开了哪些端口 并查看开启端口的软件
  6. 如何处理Docker错误消息:please add——insecure-registry
  7. 洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
  8. 《Spring_four》团队作业4—基于原型的团队项目需求调研与分析
  9. Socket.IO for Unity 简要介绍
  10. JavaScript正则表达式-基础入门