使用SQL输出次日成功的留存率、新登用户数、新用户的次日留存率

本文介绍了如何使用SQL查询次日成功留存率、新登用户数以及新用户的次日留存率。通过分析数据库中的登录记录,计算出新用户在首次登录后的次日再次登录概率,以及每天新登录用户的数量,并展示新用户次日留存的计算方法。

次日成功留存率

存在一个表:
在这里插入图片描述
输出新登录用户次日成功的留存率,即第一天登录后。第二天再次登录的概率。
在这里插入图片描述
代码:

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(min(date),'+1 day') from login group by user_id);

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

select count(distinct user_id) from login`

每个用户第一天登陆的日子:

select user_id,min(date) from login group by user_id`

在第一天登录的新用户并且第二天也登录的用户,以及第二天的日期:

`select user_id,date(min(date),'+1 day') from login group by user_id`

最后使用count (distinct *) 可以得到各个部分的人数。

新登用户数

输出每个日期登录新用户个数:
在这里插入图片描述
每个日期里面用户登录的数目:

select l1.date,count(distinct l1.user_id)
from login l1
group by l1.date;

使用where字句找出新用户,思路是如果选取的日期正好等于用户登录的最小日期,而且用户id相同时,那么肯定就是这个日期登录的新用户:

select l1.date,count(distinct l1.user_id)
from login l1
where l1.date =
(select min(date) from login where user_id=l1.user_id)
group by l1.date;

输出:

2020-10-12|3
2020-10-14|1

2020-10-13没有新用户登录,应该输出为0的,这个语句却没有输出。但是login表的日期是完整的,所以我们考虑将login表当主表,上面查出来的表左连接到主表,顺序输出,并使用ifnull语句将null变成0,最后再加上一个order by语句,就可以得到题目想要的结果了:

select login.date,ifnull(n1.new_num,0)
from login 
left join 
(select l1.date,count(distinct l1.user_id) as new_num
from login l1
where l1.date =
(select min(date) from login where user_id=l1.user_id)
group by l1.date) n1
on login.date = n1.date
group by login.date order by login.date

新用户的次日留存率

统计一下每个日期新用户的次日留存率:
在这里插入图片描述
先算出每天的新用户中有多少个第二天还登陆了(当天时间 – 第一次登录时间差值为1 )

select o.date, sum(case  when o.sd =1 then 1 else 0 end) as n from 
(select user_id ,login.date ,
julianday(lead(login.date ,1,0)over(partition by user_id order by date))-julianday(min(date)over(partition by user_id order by date)) as sd 
 from login) o group by o.date

算出每天有多少个新用户:

select a.date ,sum(case a.date when a.fd then 1 else 0 end) as new
from 
(select user_id ,login.date ,min(login.date) over (partition by user_id order by login.date)as fd
from login) a group by a.date

将上面两步得出的表格进行连接,然后做除法算比率。(注意:0不能为分母要用case when 处理)

select c.date , round(1.0*c.n/ (case when b.new =0 then 1 else b.new end ),3)
from
(select o.date, sum(case when o.sd =1 then 1 else 0 end) as n from
(select user_id ,login.date ,
julianday(lead(login.date ,1,0) over(partition by user_id order by date))-julianday(min(date)over(partition by user_id order by date))
as sd from login) o group by o.date) c
left join
((select a.date ,sum(case a.date when a.fd then 1 else 0 end) as new from
(select user_id ,login.date ,min(login.date) over (partition by user_id order by login.date)as fd
from login) a group by a.date)) b
on c.date = b.date
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值