SQL计算留存率等指标

一、问题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;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值