Mysql查询用户留存/留存率问题--用户n日(内)留存、某日新增用户n日(内)留存_Jalen data analysis的博客-程序员秘密

技术标签: sql  

来源:数据运营与数据分析

Mysql查询用户留存/留存率语法

  • 计算某日的客户在第n日再次出现的概率--用户n日留存率。

  • 计算某日的客户在某个时间段内再次出现的概率--用户n日内留存率。

  • 计算某日新增的用户在第n日再次出现的概率--新用户n日留存率。

  • 计算某日新增的用户在某个时间段内再次出现的概率--新用户n日内留存率。

1.用户n日留存/留存率

计算某日的客户在第n日再次出现的概率--用户n日留存率。

  • 表名:订单总表;字段:客户编号,下单时间

-- 1.用户n日留存/留存率
-- 用户次日、3日、7日、30日,...留存/留存率

select *,
 concat(round(100*次日留存用户/日活跃用户数,2),'%')  次日留存率,
 concat(round(100*三日留存用户/日活跃用户数,2),'%')  三日留存率,
 concat(round(100*七日留存用户/日活跃用户数,2),'%')  七日留存率
from (
 select 
  date(a.下单时间) as 日期,
  count(distinct a.客户编号) as 日活跃用户数,
  count(distinct b.客户编号) as 次日留存用户,
  count(distinct c.客户编号) as 三日留存用户,
  count(distinct d.客户编号) as 七日留存用户
 from 订单总表 a 
  left join 订单总表 b 
   on a.客户编号 = b.客户编号 
   and date(b.下单时间) = date(a.下单时间) + 1
  left join 订单总表 c 
   on a.客户编号 = c.客户编号 
   and date(c.下单时间) = date(a.下单时间) + 3
  left join 订单总表 d 
   on a.客户编号 = d.客户编号 
   and date(d.下单时间) = date(a.下单时间) + 7
 where date(a.下单时间) between "2020/09/01" and "2020/09/05" 
 group by date(a.下单时间)
) p;

2.用户n日内留存/留存率

计算某日的客户在某个时间段内再次出现的概率--用户n日内留存率。

-- 2.用户n日内留存/留存率
-- 用户次日内、3日内、7日内、30日内,...留存/留存率

select *,
 concat(round(100*次日内留存用户/日活跃用户数,2),'%')  次日内留存率,
 concat(round(100*三日内留存用户/日活跃用户数,2),'%')  三日内留存率,
 concat(round(100*七日内留存用户/日活跃用户数,2),'%')  七日内留存率
from (
 select 
  date(a.下单时间) as 日期,
  count(distinct a.客户编号) as 日活跃用户数,
  count(distinct b.客户编号) as 次日内留存用户,
  count(distinct c.客户编号) as 三日内留存用户,
  count(distinct d.客户编号) as 七日内留存用户
 from 订单总表 a 
  left join 订单总表 b 
   on a.客户编号 = b.客户编号 
   and date(b.下单时间) = date(a.下单时间) + 1
  left join 订单总表 c 
   on a.客户编号 = c.客户编号 
   and (date(c.下单时间) BETWEEN date(a.下单时间) + 1 AND date(a.下单时间) + 3)
  left join 订单总表 d 
   on a.客户编号 = d.客户编号 
   and (date(d.下单时间) BETWEEN date(a.下单时间) + 1 AND date(a.下单时间) + 7)
 where date(a.下单时间) between "2020/09/01" and "2020/09/05" 
 group by date(a.下单时间)
) p;

3.新增用户n日留存/留存率

计算某日新增的用户在第n日再次出现的概率--新用户n日留存率。

## 3.某日新增用户留存/留存率
## 计算某日新增的用户在次日、3日、7日的留存率--新用户n日留存

select *,
 concat(round(100*次日留存用户/日新增用户数,2),'%')  次日留存率,
 concat(round(100*三日留存用户/日新增用户数,2),'%')  三日留存率,
 concat(round(100*七日留存用户/日新增用户数,2),'%')  七日留存率
from (
 select 
  date(a.下单时间) as 新增日期,
  count(distinct a.客户编号) as 日新增用户数,
  count(distinct b.客户编号) as 次日留存用户,
  count(distinct c.客户编号) as 三日留存用户,
  count(distinct d.客户编号) as 七日留存用户
 from 
 (
  select  
   date(t1.下单时间) as 下单时间,
   t1.客户编号 
  from 订单总表 as t1
   left join 订单总表 as t2
   on t1.客户编号=t2.客户编号
   and t2.下单时间<t1.下单时间
  where 
   (date(t1.下单时间) between "2020/09/01" and "2020/09/05") 
  and t2.下单时间 is Null  
 ) as a 
  left join 订单总表 b 
   on a.客户编号 = b.客户编号 
   and date(b.下单时间) = date(a.下单时间) + 1
  left join 订单总表 c 
   on a.客户编号 = c.客户编号 
   and date(c.下单时间) = date(a.下单时间) + 3
  left join 订单总表 d 
   on a.客户编号 = d.客户编号 
   and date(d.下单时间) = date(a.下单时间) + 7
 group by date(a.下单时间)
) p;

4.新增用户n日内留存率

计算某日新增的用户在次日内、3日内、7日内的留存率--新用户n日内留存率。

## 4.新增用户n日内留存率
## 计算某日新增的用户在次日内、3日内、7日内的留存率--新用户n日内留存率。
select *,
 concat(round(100*次日留存用户/日新增用户数,2),'%')  次日留存率,
 concat(round(100*三日留存用户/日新增用户数,2),'%')  三日留存率,
 concat(round(100*七日留存用户/日新增用户数,2),'%')  七日留存率
from (
 select 
  date(a.下单时间) as 新增日期,
  count(distinct a.客户编号) as 日新增用户数,
  count(distinct b.客户编号) as 次日留存用户,
  count(distinct c.客户编号) as 三日留存用户,
  count(distinct d.客户编号) as 七日留存用户
 from 
 (
  select  
   date(t1.下单时间) as 下单时间,
   t1.客户编号 
  from 订单总表 as t1
   left join 订单总表 as t2
   on t1.客户编号=t2.客户编号
   and t2.下单时间<t1.下单时间
  where 
   (date(t1.下单时间) between "2020/09/01" and "2020/09/05") 
  and t2.下单时间 is Null  
 ) as a 
  left join 订单总表 b 
   on a.客户编号 = b.客户编号 
   and date(b.下单时间) = date(a.下单时间) + 1
  left join 订单总表 c 
   on a.客户编号 = c.客户编号 
   and (date(c.下单时间) BETWEEN date(a.下单时间) + 1 AND date(a.下单时间) + 3)
  left join 订单总表 d 
   on a.客户编号 = d.客户编号 
   and (date(d.下单时间) BETWEEN date(a.下单时间) + 1 AND date(a.下单时间) + 7)
 group by date(a.下单时间)
) p;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41685388/article/details/109299885

智能推荐

iOS_book 01- Xcode基本用法和Hello world_weixin_30613727的博客-程序员秘密

(基于精通iOS开发 第七版)iOS程序的特点1:在iOS中,一次只能有一个应用处于活动状态并显示在屏幕上。从iOS 4开始, 可以专门编写代码使用户按下home键后,app可以在后台继续运行。不处于活动状态或者在后台运行时,应用程序不会占用任何CPU资源,这会严重干扰其与开放式网络的链接。iOS允许后台处理,不过要使应用程序在此状况下良好运行则需要开发者自己努力。2:只能使...

linux tar 绝对路径,tar打包使用绝对路径详解_李嗲Lydia的博客-程序员秘密

首先应该明确:*nix系统中,使用tar对文件打包时,一般不建议使用绝对路径。通常是在两台环境相似的机器上进行同步复制的时候,才有需要使用绝对路径进行打包。使用绝对路径打包时如果不指定相应的参数,tar会产生一句警告信息:”tar: Removing leading `/’ from member names”,并且实际产生的压缩包会将绝对路径转化为相对路径。比如:[email protected] ~ # t...

java8 特性学习 stream()_飞花落雨的博客-程序员秘密

教程:https://www.runoob.com/java/java8-streams.html理解:对集合元素快速筛选、过滤 、收集实体集合。fiter(判断条件)。sorted(排序条件)。map(映射关系)。collect(Collectors.toList());1、filter() 判断条件形式为: 自定义的变量-&gt;自定义的变量。属性 与其他值或表达式进行潘判断 //自定义的变量 无需声明 或者说是 匿名式声明函数如:// 计算空字符串 // 计算空...

Swift之扩展的使用和实例展示_╰つ栺尖篴夢ゞ的博客-程序员秘密

一、什么是扩展?扩展就是向一个已有的类、结构体或枚举类型添加新功能,扩展可以对一个类型添加新的功能,但是不能重写已有的功能。Swift 中的扩展可以:添加计算型属性和计算型静态属性;定义实例方法和类型方法;提供新的构造器;定义下标;定义和使用新的嵌套类型;使一个已有类型符合某个协议。扩展声明使用关键字 extension:extension SomeType { // 加到SomeType的新功能写到这里}一个扩展可以扩

史海峰:万字长文剖析技术人如何成长_中生代技术的博客-程序员秘密

作者介绍史海峰,公众号IT民工闲话作者第79篇好文:11000字 | 18分钟阅读前言我今天不讲技术,主要分享作为IT民工最近十年的职业历程,希望能给...

Android源码编译——RK3128开发板基于Android5.1源码编译小记_rk3128 安卓 广告机 源码_chengkni的博客-程序员秘密

前言:本次小记主要分为三段。前两段相当于对源码编译的一个回顾。本次小记主要第三段,记下了编译中出现的几个问题,以便日后需要。1、编译时编译线程过多。导致编译失败。2、编译image没问题打包OTA时出现错误。一、编译环境1、硬件环境:(以下为官方建议)> 编译 Android 对机器的配置要求较高:64 位 CPU16GB 物理内存+交换内存

随便推点

numpy模块的sin函数实例_numpy sin_WEL测试的博客-程序员秘密

类似函数可以参考详细参数链接:https://docs.scipy.org/doc/numpy/reference/generated/numpy.sin.html具体操作实例在这不做讲解!#coding=utf8'''a为ndarray对象np.sin(a) 对矩阵a中每个元素取正弦x是单个数据值:np.sin(x) 对x元素取正弦np.pi:是一个常量,代表3.14159

java 【导出excel 】文件名出现中文乱码_导出时 中文文件名乱码_muzi1314_的博客-程序员秘密

使用poi进行导出excel时,发现导出的文件名如果是中文,会出现乱码问题,将文件名进行如下编码后即可解决:response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("gbk"), "iso8859-1")+".xlsx");或者:response.s

python中定义类一定要有init吗_为什么要在python基本类中定义init方法,基础_卡路里克星的博客-程序员秘密

在Python中定义类经常会用到__init__函数(方法)__init__的理解:1.首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。2.__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量)。__init__函数(方法)的第一个参数必须为self,后续参数为自己定义。__init__()方法意义重大的原因有两个。第一个原因是在...

Golang中 json.Decoder vs json.Unmarshal_json.unmarshal 数组_jason_cuijiahui的博客-程序员秘密

json的反序列化方式有两种:Use json.Unmarshal passing the entire response stringdata, err := ioutil.ReadAll(resp.Body)if err == nil &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; data != nil { err = json.Unmarshal(data, value)}using json...

第一个react应用程序,初体验_#秃头小宝贝的博客-程序员秘密

react开发需要引入多个依赖文件,其中react.js、react-dom.js这两个文件是我们创建react应用程序必须要引入的依赖文件。react.js 是核心,提供创建元素,组件等功能https://unpkg.com/[email protected]/umd/react.development.jsreact-dom.js 提供DOM相关功能https://unpkg.com/[email protected]/umd/react-dom.development.js下载对应的react.js和re

推荐文章

热门文章

相关标签