-- 新用户首日登入日期表
with first_date as
(
-- 选择每个用户的首次登入日期
select user_id, min(date) as date
from login
group by user_id
),
-- 新用户首次登入后的次日登入日期表
second_date as
(
-- 选择首次登入后的次日登入日期
select distinct login.user_id, login.date
from first_date
join login
on first_date.user_id = login.user_id
and date_add(first_date.date, interval 1 day) = login.date
)
-- 计算次日留存率,并保留三位小数
select round(count(second_date.date) / count(first_date.date), 3) as retention_rate
from first_date
left join second_date
on first_date.user_id = second_date.user_id;