题解 | #2021年11月每天新用户的次日留存率#

2021年11月每天新用户的次日留存率

https://www.nowcoder.com/practice/1fc0e75f07434ef5ba4f1fb2aa83a450

SELECT
  dt,
  round(
    AVG(
      case
        when DATEDIFF(sed_day, dt) = 1 then 1
        else 0
      end
    ),
    2
  ) as uv_left_rate
FROM
(
    SELECT
      dt,
      uid,
      lead(dt, 1) over (
        PARTITION by uid
        ORDER BY
          dt
      ) sed_day,
      row_number() over(
        partition by uid
        ORDER BY
          dt
      ) nu
    FROM
(
        SELECT
          DATE_FORMAT(in_time, '%Y-%m-%d') dt,
          uid
        FROM
          tb_user_log
        UNION
        SELECT
          DATE_FORMAT(out_time, '%Y-%m-%d') dt,
          uid
        FROM
          tb_user_log
      ) t_1
  ) t_2
WHERE
  DATE_FORMAT(dt, '%Y-%m') = '2021-11'
  AND nu = 1
GROUP BY
  dt;

-- 解题思路

-- 1.合并时间序列,将进入时间和离开时间合并为一个时间序列。(对应问题:如果in_time-进入时间和out_time-离开时间跨天了,在两天里都记为该用户活跃过)

-- 2.查找用户下一次出现的日期,因为下一天日期为次日,则为次日活跃。通过lead(dt,1) over (PARTITION by uid ORDER BY dt)实现。

-- 3.过滤获取用户第一次出现数据,因为用户第一次出现,才是次日活跃的计算范畴,因此,需要过滤取出第一次出现的数据。通过row_number() over(partition by uid ORDER BY dt),nu =1。

#你的秋招进展怎么样了##2022届毕业生现状##23届找工作求助阵地##0offer是寒冬太冷还是我太菜#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务