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

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

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

select it , 
    round(sum(case when pd1+pd2 >=1 then 1 else 0 end)/count(*),2)
from (
    select distinct
        t1.uid , 
        date_format(t1.in_time,'%Y-%m-%d') it,
        case when t2.id >0 then 1 else 0 end pd1, 
        case when t3.id >0 then 1 else 0 end pd2,
        case when t4.nd = date_format(t1.in_time,'%Y-%m-%d') then 1 else 0 end pd3
    FROM tb_user_log t1
    left join tb_user_log t2 
        on t1.uid = t2.uid and timestampdiff(day,t1.in_time,t2.in_time) =1
    left join tb_user_log t3
        on t1.id = t3.id and date_format(t3.out_time,'%Y%m%d')-date_format(t1.in_time,'%Y%m%d')>=1
    left join (
        select uid , date_format(min(in_time),'%Y-%m-%d') nd
        from tb_user_log 
        group by uid) t4
        on t1.uid = t4.uid) t5
where pd3 >0 and left(it,7) = '2021-11'
group by 1
order by 1

首先我是一个小白,下面是我做这题的心得:

说实话,有些函数的结果跟预想的不同,这让人非常头疼……

譬如in_time是23:59分 跟out_time 00:01 差2分钟,从日期上来看刚好跨越了一个自然日。那timestampdiff(day , in_time , out_time) 按理来说应该是返回1的,可是返回的居然是0,真的头痛。为了找出这个误差,花了很长的时间!!

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务