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

题目地址
挺不错的一个题,把几个知识点都用到了,主要用到的知识点有

  • count(*)over
  • UNION
  • left join

用 UNION 将 in_time 和 out_time 看作同一列,顺便去重,count(*)over 判断新出现节点,left join 利用其不满足 on 条件就为 NULL 的性质找出次日留存的项。
另外,With as 算是一个比较好的技巧,免得各种嵌套把自己整晕了。
顺便附一个 left join 的博客

With base as(
select uid,dt,
    count(*)over(partition by uid order by dt) as times
from(
    select uid,
        date_format(in_time,'%Y-%m-%d') as dt
    from tb_user_log
    UNION
    select uid,
        DATE_FORMAT(out_time,'%Y-%m-%d') as dt
    from tb_user_log
    )tmp
)

select now.dt,
    round(count(nxt.dt)/count(*),2) as uv_left_rate
from base now
left join base nxt
on now.uid=nxt.uid and nxt.dt=timestampadd(day,1,now.dt)
where now.times=1 and date_format(now.dt,'%Y-%m')='2021-11'
group by dt
order by dt;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值