一、问题1:留存率计算
字段及表说明:
表名:user_log
字段名:
log_day:登录日期
device_id:用户设备id
app_id:用户app的id,其中device_id和app_id确定唯一的用户
1.1计算某日留存率(次日、3日、7日、30日)
--计算次日、3日、7日、30日留存率
select log_day,count(user_id_d1)/count(user_id_d0) retention_d1,
count(user_id_d3)/count(user_id_d0) retention_d3,
count(user_id_d7)/count(user_id_d0) retention_d7,
count(user_id_d30)/count(user_id_d0) retention_d30 from(
--匹配后续
select a.log_day,a.user_id_d0,b.device_id||b.app_id user_id_d1,c.device_id||c.app_id user_id_d3,
d.device_id||d.app_id user_id_d7,e.device_id||e.app_id user_id_d30 from(
--找出新增
select log_day,device_id||app_id user_id_d0 from user_log a where log_day=log_day'day'
and device_id||app_id not in(select distinct device_id||app_id from user_log b
where b.log_day<a.log_day))a
left join user_log b on a.log_day=(b.log_day-1) and a.user_id_d0=b.device_id||b.app_id
left join user_log c on a.log_day=(c.log_day-3) and a.user_id_d0=c.device_id||c.app_id
left join user_log d on a.log_day=(d.log_day-7) and a.user_id_d0=d.device_id||d.app_id
left join user_log e on a.log_day=(e.log_day-30) and a.user_id_d0=e.device_id||e.app_id)
group by log_day
1.2计算每日留存率(次日、3日、7日、30日)
--创建留存率储存表
create table user_retention_monitor (
log_day date,retention_d1 number,retention_d3 number,retention_d7 number,retention_d30 number);
--先清空表
truncate table user_retention_monitor;
declare
day date; --声明变量
begin
select min(log_day) into day from user_log; --变量赋初值
loop
insert into user_retention_monitor
--计算留存率
select log_day,count(user_id_d1)/count(user_id_d0) retention_d1,
count(user_id_d3)/count(user_id_d0) retention_d3,
count(user_id_d7)/count(user_id_d0) retention_d7,
count(user_id_d30)/count(user_id_d0) retention_d30 from(
--匹配后续
select a.log_day,a.user_id_d0,b.device_id||b.app_id user_id_d1,c.device_id||c.app_id user_id_d3,
d.device_id||d.app_id user_id_d7,e.device_id||e.app_id user_id_d30 from(
--找出新增
select log_day,device_id||app_id user_id_d0 from user_log a where log_day=log_day'day'
and device_id||app_id not in(select distinct device_id||app_id from user_log b
where b.log_day<a.log_day))a
left join user_log b on a.log_day=(b.log_day-1) and a.user_id_d0=b.device_id||b.app_id
left join user_log c on a.log_day=(c.log_day-3) and a.user_id_d0=c.device_id||c.app_id
left join user_log d on a.log_day=(d.log_day-7) and a.user_id_d0=d.device_id||d.app_id
left join user_log e on a.log_day=(e.log_day-30) and a.user_id_d0=e.device_id||e.app_id)
group by log_day;
commit;
day:=day+1;
exit when day>trunc(sysdate);
end loop;
end;
select * from user_retention_monitor;
来源:CSDN
作者:weixin_45086773
链接:https://blog.csdn.net/weixin_45086773/article/details/103849231