SQL计算留存率等指标

非 Y 不嫁゛ 提交于 2020-01-09 04:08:37

一、问题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;
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!