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

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

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函数,故有最终语句,如上。


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

全部评论

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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