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

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

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

WITH all_active AS ( -- 这里将数据连起来其实是因为有坑,可能以为人晚上看,结束的时候已经是第二天凌晨了
    -- 拆成两条记录,取 in_time/out_time 的日期,并去重
    SELECT DISTINCT uid, DATE(in_time) AS active_day
    FROM tb_user_log
    WHERE in_time IS NOT NULL
    UNION
    SELECT DISTINCT uid, DATE(out_time) AS active_day
    FROM tb_user_log
    WHERE out_time IS NOT NULL
) ,
xia As ( --这里是查询下一天的阅读日期
    SELECt 
        uid,
        active_day,
        LEAD(active_day) OVER(PARTITION BY uid ORDER BY active_day ASC) AS next_time
    FROM all_active
)
,
new_user_daily AS ( --这里查询第一次登陆的时间
    SELECT 
        MIN(active_day) AS dt,
        uid
    FROM all_active
    GROUP BY uid
    HAVING MONTH(dt) = 11
),
daily_retention AS ( --这里进行表链接,按首次登陆时间和uid进行链接
    SELECT 
        n.dt,
        COUNT(DISTINCT n.uid) AS new_user_count,
        COUNT(DISTINCT CASE 
            WHEN DATE_ADD(n.dt, INTERVAL 1 DAY) = a.next_time THEN n.uid 
        END) AS retained_next_day
    FROM new_user_daily n
    LEFT JOIN xia a
        ON n.uid = a.uid
        AND n.dt = a.active_day
    GROUP BY n.dt
)
SELECT 
    DATE_FORMAT(dt, '%Y-%m-%d') AS dt,
    ROUND(retained_next_day * 1.0 / new_user_count, 2) AS uv_left_rate
FROM daily_retention
WHERE new_user_count > 0
ORDER BY dt;

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-25 17:23
做完了怎么知道过没过呀
投递京东等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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