【思路】
1.首先需要找到每个用户的第一登录日期以及次日日期,这步可以用group by来得到
2.得到次日日期后需要得到每个用户次日是否登录的信息,这步可以用链接的方式,如果没有登录,链接的记录就会显示None
3.最后只需要通过round(count(l.date)/count(t1.user_id),3)就可以得到概率了
4.注意点:由于最开始设置了日期的值不能为null,所以左连接时如果没有次日登陆的用户,日期那一列就会显示None,不能通过用判别null的方式计数,可以直接用count计数。
【新知识】
获取某个日期的次日日期:
date_add(日期,interval 1 day)
【初始代码】
select
round(sum(case when l.date='null' then 0 else 1 end)/count(t1.user_id),3) as p
from
(select user_id, min(date) as da, date_add(min(date),interval 1 day) as daa
from login group by user_id ) as t1
left join login as l
on t1.user_id = l.user_id
and t1.daa = l.date
报错:因为日期显示了not null所以不可以通过判别是否为Null的方式计数
【最终代码】
select
round(count(l.date)/count(t1.user_id),3) as p
from
(select user_id, min(date) as da, date_add(min(date),interval 1 day) as daa
from login group by user_id ) as t1
left join login as l
on t1.user_id = l.user_id
and t1.daa = l.date
【大佬代码】
select
round(count(distinct user_id)*1.0/(select count(distinct user_id) from login) ,3)
from login
where (user_id,date)
in (select user_id,DATE_ADD(min(date),INTERVAL 1 DAY) from login group by user_id)
区别就是一个采用子查询一个采用左连接。