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

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

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

SELECT
    t1.min_time AS dt,
    ROUND(COUNT(t2.uid) / COUNT(t1.uid), 2) AS sec_cnt
FROM(
    SELECT
        uid,
        MIN(DATE(in_time)) min_time
    FROM tb_user_log 
    GROUP BY uid
) t1
LEFT JOIN(
    SELECT uid, DATE(in_time) yestday FROM tb_user_log
    UNION
    SELECT uid, DATE(out_time) yestday FROM tb_user_log
) t2
ON t1.uid = t2.uid AND DATEDIFF(t2.yestday, DATE(t1.min_time)) = 1
WHERE month(min_time) = 11
GROUP BY dt

有两个要点

第一:通过UNION把in_time和out_time的纪录纵向拼在一起,并过滤相同的记录,如此一来就可以通过DATEDIFF函数筛选出与第一次登陆时间(使用MIN(DATE(in_time))查询得到)之间相差正好一天的记录。

第二:DATEDIFF(t2.yestday, DATE(t1.min_time)) = 1这一条件必须放在链接条件中,这样一来经过左连接,右表中不符合该条件的记录,t2.uid值将为NULL。在此基础上通过COUNT函数就能轻松得到第一天和第二天登录的人数(COUNT函数对NULL值自动跳过)。相反如果把这一条件放在WHERE中,则所有不符合该条件的记录将被直接过滤掉,就难以区分出第一、二天登录的人数。

全部评论

相关推荐

05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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