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

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

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

-- 逻辑梳理:留存率的题目一定要准备两张表,注册表是登陆表,如果非新用户那么就是两行登陆表
with tmp_1 as(
    select
    uid
    ,min(in_time) first_login
    from tb_user_log
    group by uid
),-- 这里有个非常大的坑点,不能在tmp1里直接加where筛选11月,因为如果这里加了11月的筛选,只能求出来用户在11月的第一次登录日期,这不一定是用户的注册日期
tmp_2 as(
    select
    uid
    ,date(in_time) in_time
    from tb_user_log
    union  -- 将两个表的in和out通过union相连,来解决如果一个用户的登录跨天,那么会被视为两天都活跃
    select
    uid
    ,date(out_time) in_time
    from tb_user_log
)


select  -- 这里的核心,就是通过注册表和活跃表连接,加上限制条件去判断用户是否次日活跃,如果活跃那么b.in_time一定是有值的,这是计算留存率的核心逻辑
date(a.first_login) dt
,round(count(b.in_time) / count(a.first_login),2) uv_left_rate
from tmp_1 a
left join tmp_2 b
on a.uid = b.uid
and date(a.first_login) = date_sub(b.in_time,interval 1 day)
where left(a.first_login,7) = '2021-11'
group by date(a.first_login)





全部评论

相关推荐

09-13 18:00
武汉大学 Java
点赞 评论 收藏
分享
09-01 21:40
已编辑
同济大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务