题解 | 计算用户的平均次日留存率

计算用户的平均次日留存率

https://www.nowcoder.com/practice/126083961ae0415fbde061d7ebbde453

with
r as (
    select 
    device_id,
    date_add(date, interval 1 day) as next_day
    from question_practice_detail
)
, b as (
    select 
    a.device_id, 
    a.date,
    count(distinct(a.device_id)) as total_cnt,
    count(distinct(case when r.next_day is not null then a.device_id end)) as retention_cnt
    from question_practice_detail as a
    left join r on r.device_id = a.device_id 
    and r.next_day = a.date
    group by 1,2
)

select 
round(sum(retention_cnt)/sum(total_cnt),4) as avg_ret
from b 
;

本题是大厂SQL面试中常考的留存率问题,对于留存率问题的一般解题思路如下:

(1)找到首次登录时间T;

(2)找T+N对应时间是否有登录记录,有则留存,否则流失;

(3)统计步骤(2)对应计数项。

其中,主要考察使用到日期函数和聚合函数。

本题中,并非一般的首次登录留存,而是二次答题率,因此对于去重的考虑并非是单个用户只保留一条记录,而是单个用户、当天作为一条去重记录保存:count(distinct(a.device_id)) as total_cnt

关于利用left join连接的约束,找到后一天有答题记录的用户。

全部评论

相关推荐

酷酷我灵儿帅:这去不去和线不线下面说实话没啥关系
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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