with
newdetail as(
select
user_id,
date,
case
when row_number() over(partition by user_id order by date asc)=1
then 1 else 0 end as is_new
from
login),
new_user as(
select date,user_id
from newdetail
where is_new=1)
select
login.date,
case
when round(t2.cnt*1.0/t1.cnt,3)<>0
then round(t2.cnt*1.0/t1.cnt,3)
else round(0,3)
end as p
from
login
left join
(select
date,count(distinct user_id) as cnt
from
new_user group by date
) t1
on login.date=t1.date
left join
(select
u.date,count(distinct l.user_id) as cnt
from new_user u left join login l
on u.user_id=l.user_id and l.date=date_add(u.date,interval 1 day)
group by u.date
)t2
on
t1.date=t2.date
group by
login.date
order by
login.date asc