题解 | #统计一下牛客每个日期新用户的次日留存率#

牛客每个人最近的登录日期(五)

http://www.nowcoder.com/practice/ea0c56cd700344b590182aad03cc61b8

# 想法1
select a.date, 
       #sum(case when a.date = m.firstDate then 1 else 0 end) cn_new,
       #sum(case when n.user_id is not null then 1 else 0 end) cn_liv
       ifnull(
           round(
           sum(case when n.user_id is not null then 1 else 0 end) /
           sum(case when a.date = m.firstDate then 1 else 0 end)
           , 3
       ), 0.000) as p
  from login a
  left join (select user_id, min(date) firstDate 
               from login
              group by user_id) m
    on a.user_id = m.user_id
   and a.date = m.firstDate
  left join login n
    on m.user_id = n.user_id
   and m.firstDate = date_add(n.date, interval -1 day)
 group by a.date
 order by date;          

想法的逻辑
a表:为了取全部日期,故使用login表的日期做结果展示(后续采用左关联);
m表:取各用户第一次登录的日期,可以通过此日期取出当日新用户数cn_new;
n表:在login表找出新用户次日登录数据,即m表数据中在次日有登录的记录;
该逻辑下12日数据举例应为
图片说明
在m和n分别统计数据量,就得到了分母cn_new:“12日新入网用户数”,分子cn_liv:“12日新入网用户的次日留存用户数”,两个相除保留3位小数即为结果。另,有分母为0的情况,一开始依旧是用case when实现,看了排行才知道有ifnull函数,故有最终语句,如上。


注:#为注释部分,做测试使用,检查分子分母与预期一致。

全部评论

相关推荐

09-19 12:15
门头沟学院 Java
迷茫的大四🐶:这下是真的打牌了,我可以用感谢信和佬一起打牌吗
点赞 评论 收藏
分享
10-20 11:11
辽宁大学 营销
点赞 评论 收藏
分享
11-13 10:17
门头沟学院 Java
昨天面美团,jvm,juc问的好深啊,感觉小林coding不太够喔,牛油们有没有什么推荐的八股网站嘛🕒 岗位/面试时间👥 面试题目🤔 面试感受
明天不下雨了:小林Coding:https://xiaolincoding.com/ 全栈哥:https://www.pdai.tech/ Guide哥:https://javaguide.cn/ 秀哥:https://interviewguide.cn/ 沉默王二:https://javabetter.cn/home.html 磊哥:https://www.javacn.site/interview/basic/ 小傅哥:https://bugstack.cn/ 源码哥:https://doocs.github.io/source-code-hunter/#/ 各大厂的公众号技术文章和一些经典的书籍
面试太紧张了怎么办?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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