select
date
,if(p is null,0.000,p) p
from
(-- 全日期
select
date
from
login
group by date
) a
left join
(-- 有次日登录数据的日期的次日登录率
select
first_login_date
,cast(count(distinct if(datediff(date,first_login_date) = 1,user_id,null))/count(distinct user_id) as decimal(8,3)) p
from
(select
user_id
,date
-- 每个user_id的首次登陆日期
,min(date) over(partition by user_id) first_login_date
from
login
) a
group by first_login_date ) b
on a.date = b.first_login_date
order by date