题目中要求是

  1. 新登录用户

    查询用户的user_id和首次登陆日期,确认是新登录用户。

    select user_id,min(date) first_date from login group by user_id
  2. 次日成功的留存率,即第1天登陆之后,第2天再次登陆的概率

    在1中的表后连接第2天的登陆时间。如果第2天登陆了,l2.date即为第二天的日期,如果第2天没有登陆,l2.date即为null。根据l2.date是否为null,来判断第2天是否登陆。

    from (select user_id,min(date) first_date from login group by user_id) l1
    left join login l2 on l1.user_id =l2.user_id and l2.date=date_add(l1.first_date,interval 1 day)

    则第2天再次登陆的次数为count(l2.date),第1天登陆的新用户数为count(*),次日成功留存率为count(l2.date)/count(*)

  3. 保存小数点后面3位(3位之后的四舍五入)

    使用round()进行修约。

则最终MySQL语句为:

select round(count(l2.date)/count(*),3) p
from (select user_id,min(date) first_date from login group by user_id) l1
left join login l2 on l1.user_id =l2.user_id and l2.date=date_add(l1.first_date,interval 1 day)