# # 步骤1,t1,查询每个用户的初次登录日期
# select user_id, min(date) as min_date
# from login
# group by user_id
# # 步骤2,t2,查询每个日期的新用户
# select date,
# (case when login.date = t1.min_date then user_id else null end) as new
# from login
# inner join (
# # 步骤1,查询每个用户的初次登录日期
# select user_id, min(date) as min_date
# from login
# group by user_id) as t1 using(user_id)
# # 步骤3,t3,原日期加一天的date1,对比原日期,找出日期一致的原日期和user_id
# select user_id, date,
# date_add(date, interval +1 day) as date1
# from login
# having (user_id, date1) in (select user_id, date from login)
# 步骤4,查询每个日期新用户的次日留存率,结果保留小数点后面3位数(3位之后的四舍五入),并且查询结果按照日期升序排序
select t2.date,
round(ifnull(sum(case when t2.new = t3.user_id then 1 else 0 end) / count(distinct t2.new),0), 3) as p
from (
# 步骤2,t2,查询每个日期的新用户
select date,
(case when login.date = t1.min_date then user_id else null end) as new
from login
inner join (
# 步骤1,查询每个用户的初次登录日期
select user_id, min(date) as min_date
from login
group by user_id) as t1 using(user_id)) as t2
left join (
# 步骤3,t3,原日期加一天的date1,对比原日期,找出日期一致的原日期和user_id
select user_id, date,
date_add(date, interval +1 day) as date1
from login
having (user_id, date1) in (select user_id, date from login)) as t3 using(date)
group by t2.date
order by date;