牛客SQL70 牛客每个人最近的登录日期(五)(最易懂题解)

请你写出一个sql语句查询每个日期新用户的次日留存率,结果保留小数点后面3位数(3位之后的四舍五入),并且查询结果按照日期升序排序

select date
        ,ifnull(
            
            round(
                
            (sum(case when (user_id,date_add(date, interval 1 day))in
            (select user_id,date
             from login)
            then 1 else 0 end))
                /
            (sum(case when (user_id,date)in
            (select user_id,min(date)from login group by user_id)
            then 1 else 0 end)),
                
                3),
                
                0)as p
from login
group by date
order by date;

本题难度为困难,但是我愿称其为81道sql里面最难的一道,并且已知的题解里面非常混乱,我将代码分成了几个层次,便于理解。

题目要求查找某日期的新用户次日留存率,计算方法为:
当日后一天登录的记录数量/当日登录的新用户记录数量
如果当日没有新用户登录,则被除数为0,结果为null,故使用ifnull函数。

分子分母都通过group by date后sum和case when搭配计数,分母的计数原理易懂,通过group by和min(date)筛选当日新用户记录,
分子则是userid和date_add(date, interval 1 day)组合筛选,其中user_id在当前日期必有登录记录,date_add(date, interval 1 day)即为第二天的日期,两者组合即可筛选出第二日也登录的记录数量。

如果不懂可以评论,题目本身比较难,本题解代码量相对较小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值