用SQL进行用户留存率计算

x33g5p2x  于2022-04-14 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(316)

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

目录:

    1. 案例数据
    1. 思路分析
    1. 完整代码

1. 案例数据

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

账号创建日志


账号创建日志

用户登录日志


登录日志

2. 思路分析

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

注意:我这里用的MYSQL环境

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

  • 考虑到用户每天登录的次数不一定只有一次,为了方面后续的数据处理,可以先对登录数据按照日期和用户id进行去重DISTINCT处理
  1. SELECT DISTINCT
  2.  STR_TO_DATE( $part_date, '%Y-%m-%d' ) login_date,
  3.  role_id 
  4. FROM
  5.  role_login
  • 为了计算某条登录日志是该用户创建账号后的第几天登录,我们可以用用户登录日志和账号创建日志进行inner join(这里考虑到不在统计周期内的创建账号的用户数据也会记录在用户登录日志里,所以去掉)
  1. SELECT
  2.  login_log.role_id,
  3.  create_date,
  4.  login_date
  5. FROM
  6.  ((
  7.   SELECT DISTINCT
  8.    STR_TO_DATE( $part_date, '%Y-%m-%d' ) login_date,
  9.    role_id 
  10.   FROM
  11.    role_login 
  12.   ) login_log
  13.  INNER 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获取第几天登录
  1. SELECT
  2.  login_log.role_id,
  3.  create_date,
  4.  DATEDIFF( login_date, create_date ) day_diff 
  5. FROM
  6. ...

  • 对于第0天登录的数据则可以理解为新增用户数,第N(≥1)天登录的数据则为这批新增用户后续有登录的用户数
  1. SELECT
  2.  create_date 
  3. , count((CASE WHEN (day_diff = 0) THEN role_id END)) 新增用户数
  4. , count((CASE WHEN (day_diff = 1) THEN role_id END)) 次日留存
  5. , count((CASE WHEN (day_diff = 2) THEN role_id END)) 3日留存
  6. , count((CASE WHEN (day_diff = 7) THEN role_id END)) 7日留存
  7. FROM
  8. temp_1
  9. GROUP BY
  10.  create_date

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

3. 完整代码

  1. SELECT
  2.   create_date
  3. , 新增用户数
  4. , concat(CAST(ROUND((100 * 次日留存) / 新增用户数,2) AS char), '%') 次日留存率
  5. , concat(CAST(ROUND((100 * 3日留存) / 新增用户数,2) AS char), '%') 3日留存率
  6. , concat(CAST(ROUND((100 * 7日留存) / 新增用户数,2) AS char), '%') 7日留存率
  7. FROM
  8.   (
  9.    SELECT
  10.      create_date
  11.    , count((CASE WHEN (day_diff = 0) THEN role_id END)) 新增用户数
  12.    , count((CASE WHEN (day_diff = 1) THEN role_id END)) 次日留存
  13.    , count((CASE WHEN (day_diff = 2) THEN role_id END)) 3日留存
  14.    , count((CASE WHEN (day_diff = 7) THEN role_id END)) 7日留存
  15.    FROM
  16.      (
  17.       SELECT
  18.         login_log.role_id
  19.       , create_date
  20.       , DATEDIFF(login_date, create_date) day_diff
  21.       FROM
  22.         ((
  23.          SELECT DISTINCT
  24.            STR_TO_DATE($part_date, '%Y-%m-%d') login_date
  25.          , role_id
  26.          FROM
  27.            role_login
  28.       )  login_log
  29.       INNER JOIN (
  30.          SELECT DISTINCT
  31.            STR_TO_DATE($part_date, '%Y-%m-%d') create_date
  32.          , role_id
  33.          FROM
  34.            role_create
  35.       )  create_log ON (login_log.role_id = create_log.role_id))
  36.    )  temp_1
  37.    GROUP BY create_date
  38. )  temp_2
  39. ORDER BY create_date ASC

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

END -

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

相关文章