SQL计算用户留存率问题

 更新时间:2024年09月02日 11:23:49   作者:黑白交界  
电商业务中需要计算用户留存情况,在时间维度上可以分为用户次日、多日后的留存情况,本文就来详细的介绍一下如何计算,具有一定的参考价值,感兴趣的可以了解一下

概念

电商业务中需要计算用户留存情况,在时间维度上可以分为用户次日、多日后的留存情况,用留存率表示。留存率计算方式如下:

次日留存率 = 当日新用户在次日登录的数量 / 当日新用户注册数量

三日留存率 = 当日新用户在第四天登录的数量 / 当日新用户注册数量

七日留存率 = 当日新用户在第八天登录的数量 / 当日新用户注册数量

其他时间的留存率计算同理。

情况一

假设现在有两张表,一张是注册信息表register_info,另一张是登录信息表login_info,两个表格数据如下。

现在分别计算出每日的新增用户数,以及次日、三日、七日留存率。

首先,将两张表做一个连接,用datediff函数选出用户注册后七日仍有登录的数据(条件1),连接条件是用户id相同(条件2)。查询代码如下:

select 
    r.uid,
	date(r.register_date) as rt,
	date(l.login_time) as lt,
	datediff(l.login_time, r.register_date) as tdiff
from register_info r
left join login_info l 
on r.uid=l.uid
and date(l.login_time) between date(r.register_date)+interval 1 day and date(r.register_date)+interval 7 day		
order by uid asc

查询结果如下:(这里每个用户的注册时间只有一个,所以会得出每个用户所有注册登录时间的排列组合便于后续计算)

之后利用case条件判断和count函数计算出各种留存率情况。代码如下:

select 
	rt as 日期,
	count(distinct uid) as 新增用户数,
	count(distinct case when tdiff=1 then uid end)/count(distinct uid) as 次日留存率,
	count(distinct case when tdiff=3 then uid end)/count(distinct uid) as 三日留存率,
	count(distinct case when tdiff=7 then uid end)/count(distinct uid) as 七日留存率
from 
(
	select 
		r.uid,
		date(r.register_date) as rt,
		date(l.login_time) as lt,
		datediff(l.login_time, r.register_date) as tdiff
	from register_info r
	left join login_info l 
	on r.uid=l.uid
	and date(l.login_time) between date(r.register_date)+interval 1 day and date(r.register_date)+interval 7 day		
	order by uid asc
) t1
group by rt

得到结果如下:

情况二

假如现在只有一张用户登录信息表user_login_info,其中默认每个用户最早的登录时间就是注册时间,表格数据如下:

所以我们需要先用两个子查询得出类似(1)中的注册表t1和登录表t2,之后操作与(1)中相同,代码如下:

select
	count(distinct uid) 新增用户数,
    count(distinct case when tdiff=1 then uid end)/count(distinct uid) as 次日留存率,
    count(distinct case when tdiff=3 then uid end)/count(distinct uid) as 三日留存率,
    count(distinct case when tdiff=7 then uid end)/count(distinct uid) as 七日留存率
from
(
	select t1.uid, t1.rt, t2.lt, datediff(t2.lt,t1.rt) as tdiff
	from
	(
		(select user_id as uid, min(date(login_time)) as rt from user_login_info group by user_id) t1
		LEFT JOIN
		(select user_id as uid, date(login_time) as lt from user_login_info) t2
		on t1.uid=t2.uid and t2.lt between t1.rt + interval 1 day and t1.rt + interval 7 day
	)
) t3
group by rt
order by rt asc

其中t3就是情况一中得到的t1.    

查询结果如下:

到此这篇关于SQL计算用户留存率问题的文章就介绍到这了,更多相关SQL 用户留存率内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • Sql Server 2012 转换函数的比较(Cast、Convert和Parse)

    Sql Server 2012 转换函数的比较(Cast、Convert和Parse)

    Cast、Convert 和 Parse 都是 Sql Server 2012 中的内置转换函数,其作用是:一种数据类型转换为另一种数据类型。其中前两者的差别较小,但 Parse 为 Sql Server 2012 新增函数,也是最近在分析 Sql Server 2012 新特性的时间,才有想把这3个函数拿出来进行比较分析的想法
    2012-07-07
  • SQL Server 表变量和临时表的区别(详细补充篇)

    SQL Server 表变量和临时表的区别(详细补充篇)

    这篇文章主要介绍了SQL Server 表变量和临时表的区别(详细补充篇),需要的朋友可以参考下
    2015-11-11
  • sqlserver获取各种形式的时间

    sqlserver获取各种形式的时间

    有时候我们需要各种各样的格式的时间,sqlserver自带的一些GETDATE函数就可以帮我们完成,这里分享下方便需要的朋友
    2013-01-01
  • SQL中不停机扩容实现的几种方法

    SQL中不停机扩容实现的几种方法

    不停机扩容是一种在不影响系统正常运行的情况下,动态增加资源以提升系统性能和容量的方法,下面就来介绍一下几种常见的方法,感兴趣的可以了解一下
    2025-04-04
  • SQL Server像MySQL一样拥有慢查询日志的操作方法(Slow Query Log慢日志)

    SQL Server像MySQL一样拥有慢查询日志的操作方法(Slow Query Log

    SQL Server一直以来被人诟病的一个问题是缺少了像MySQL的慢日志功能,程序员和运维无法知道数据库过去历史的慢查询语句,本文介绍了利用SQL Server的扩展事件捕获慢查询语句的功能,也就是我们常说的开源数据库的慢日志,感兴趣的朋友一起看看吧
    2024-07-07
  • 如何区分SQL数据库中的主键与外键

    如何区分SQL数据库中的主键与外键

    这篇文章主要介绍了如何分清SQL数据库中的主键与外键,这里简单介绍下,方便需要的朋友
    2013-06-06
  • SQL Server清除事务日志的两种方式

    SQL Server清除事务日志的两种方式

    事务日志是一种记录每次数据库修改操作的日志,它记录了每一次事务修改的详细日志,但磁盘容量始终有限制,本文主要介绍了SQL Server清除事务日志的两种方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • c#连接数据库及sql2005远程连接的方法

    c#连接数据库及sql2005远程连接的方法

    这篇文章主要介绍了c#连接sql数据库及sql2005远程连接的方法,大家参考使用吧
    2014-01-01
  • 详解SQL 通配符

    详解SQL 通配符

    这篇文章主要介绍了SQL 通配符的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • SQL中not in与null值的具体使用

    SQL中not in与null值的具体使用

    本文主要介绍了SQL中not in与null值的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01

最新评论