次日留存率=在第一天登录后第二天还登录的人数/第一天登录的人数

第一种

select round(
    count(distinct l1.user_id)/( select count(distinct user_id)  from login)
    , 3)
from login l1
inner join (
    select user_id,  min(date) as date -- 找出第一次时间
    from login  
    group by user_id
) l2 on l1.user_id=l2.user_id and l1.date=DATE_ADD(l2.date, INTERVAL 1 DAY) -- 次日时间

第二种:

select round(
    count(distinct l1.user_id) / t.cnt_total,  3
)
from login l1
inner join login l2 on l1.user_id=l2.user_id and date(l2.date)-date(l1.date)=1  -- 间隔一天的日期
inner join (
    select count(distinct user_id) as cnt_total  -- 找到首次访问的人数
    from login 
) as t