牛客网:统计一下牛客新登录用户的次日成功的留存率之DATE_ADD的用法

题目描述:

牛客每天有很多人登录,请你统计一下牛客新登录用户的次日成功的留存率,
有一个登录(login)记录表,简况如下

牛客网:统计一下牛客新登录用户的次日成功的留存率之DATE_ADD的用法_第1张图片

第1行表示user_id为2的用户在2020-10-12使用了客户端id为1的设备第一次新登录了牛客网
。。。

第4行表示user_id为3的用户在2020-10-12使用了客户端id为2的设备登录了牛客网

。。。

最后1行表示user_id为1的用户在2020-10-14使用了客户端id为2的设备登录了牛客网



请你写出一个sql语句查询新登录用户次日成功的留存率,即第1天登陆之后,第2天再次登陆的概率,保存小数点后面3位(3位之后的四舍五入),上面的例子查询结果如下: 

:

牛客网:统计一下牛客新登录用户的次日成功的留存率之DATE_ADD的用法_第2张图片

查询结果表明:

user_id为1的用户在2020-10-12第一次新登录了,在2020-10-13又登录了,算是成功的留存

user_id为2的用户在2020-10-12第一次新登录了,在2020-10-13又登录了,算是成功的留存

user_id为3的用户在2020-10-12第一次新登录了,在2020-10-13没登录了,算是失败的留存

user_id为4的用户在2020-10-13第一次新登录了,在2020-10-14没登录了,算是失败的留存

固次日成功的留存率为 2/4=0.5

(sqlite里查找某一天的后一天的用法是:date(yyyy-mm-dd, '+1 day'),四舍五入的函数为round,sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5 

mysql里查找某一天的后一天的用法是:DATE_ADD(yyyy-mm-dd,INTERVAL 1 DAY),四舍五入的函数为round)


题解 :

要统计牛客新登录用户的次日成功的留存率,首先把公式列出来:

(第一天登录的新用户并且第二天也登录的用户)/(总用户)即为新登录用户的次日成功的留存率

总用户其实挺好算,如下:

select count(distinct user_id) from login

找到每个用户第一天登陆的日子,其实挺好找,原表自连接连接条件为用户id,为保证不是同一条数据的连接,加上id不相同,同时加上次连续登陆的条件,count(DISTINCT )保证只能有一个用户,如下:

select 
COUNT(DISTINCT l.user_id)
 from login l
join login l2
on l.user_id = l2.user_id and l.id != l2.id
and DATE_ADD(l.date,INTERVAL 1 DAY) = l2.date

综合起来:

select 
round(COUNT(DISTINCT l.user_id)/(SELECT count(DISTINCT l3.user_id ) 
from
login l3),3)
 as p
 from login l
join login l2
on l.user_id = l2.user_id and l.id != l2.id
and DATE_ADD(l.date,INTERVAL 1 DAY) = l2.date

 

你可能感兴趣的:(mysql,mysql,sql)