select a.date, ifnull(round(count(l.user_id)/count(b.user_id),3),0.0)
from
(select distinct date from login ) a
left join
(select user_id,min(date) date from login group by user_id) b
on a.date=b.date
left join login l
on date_add(b.date,interval 1 day)=l.date
and b.user_id=l.user_id
group by a.date
order by a.date
  • 找到所有日期表a
  • 找到所有用户以及第一天登陆日期
  • 连接a b,以a为连接基准
  • 继续连接 login,找到次日留存的情况
  • 使用ifnull控制输出的概率