Mysql查询用户留存/留存率问题--用户n日(内)留存、某日新增用户n日(内)留存_n日留存-程序员宅基地

技术标签: 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

智能推荐

metasploit、powershell之Windows错误系统配置漏洞实战提权-程序员宅基地

文章浏览阅读730次。引言我们在获得目标机一个普通的权限时,除了常规提权方法外,还可以通过查找目标主机错误的系统配置和漏洞来获取系统权限。本节所讲的“Trusted Service Paths(可信任服务路径..._metsploit trusted_service_path

protobuf批量管理自动生成方案_protobuf 自动生成协议id-程序员宅基地

文章浏览阅读4.6k次。这是一个批量管理生成协议文件的方式。如子目录protobuilder项目,是一个协议管理项目的例子将协议模型内容写入项目中的.code文件内,可以写入多个,然后,通过一键生成项目来生成相应语言环境下的protobuf相关代码手游主流客户端开发,多为Unity3D,要用到c#服务端开发多用c++、java,同样也有用c#的,所以,这里主要实现c#,java,c++这3种语言(下文中各个语言)的protobuf协议的自动批量生成。谷歌protobuf分两个版本,proto2和proto3其中,版本syntax=_protobuf 自动生成协议id

javascript 定时修改web页面元素innerHTML(最广泛使用的技术)-程序员宅基地

文章浏览阅读249次。为什么80%的码农都做不了架构师?>>> ..._网页中的元素如何定时改变

JVM(8):JVM知识点总览-高级Java工程师面试必备_jvm(8):jvm知识点总览-高级java工程师面试必备-程序员宅基地

文章浏览阅读516次。在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功。对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后,内功就更主要了。一个内功低的人招式在奇妙也打不过一个内功高的人。比如,你剑法再厉害,一剑刺过来,别人一掌打断你的剑,你还怎么使剑法,你一掌打到一个武功高的人身上,那人没什么事,却把你震伤了,你还怎么_jvm(8):jvm知识点总览-高级java工程师面试必备

海洋cms宝塔定时linux,海洋CMS使用计划任务实现自动采集/宝塔计划任务自动采集...-程序员宅基地

文章浏览阅读334次。使用计划任务实现自动采集/宝塔计划任务自动采集* 针对Liunx,Windows自行扩展。* 无需Python3支持脚本代码如下:#!/bin/bash#########################################################程序名称:海洋CMS自动采集脚本#版本信息:seacmsbot/v2.0#发布链接:https://www.seacms...._海洋cms定时生成地图

读取 ORB-SLAM2 yaml文件 (-49) Input file is empty in function cvOpenFileStorage_can't read from input stream or input stream is em-程序员宅基地

文章浏览阅读1.6k次。注意文件开头的 %YAML:1.0 这个东西不要动,也不要和下面的注释有空行,这是用opencv生成yaml文件时自动生成的,我的就是和下面的注释有空行读取错误。别人出现类似错误是因为没有这个东西,等等。..._can't read from input stream or input stream is empty in function 'cvopenfil

随便推点

分类算法-程序员宅基地

文章浏览阅读557次。排序目录排序写在前面知识框架稳定性和时间复杂度比较名词解释比较和非比较的区别1.直接插入排序(Insertion Sort)1.1算法描述1.2算法演示1.3代码实现1.4算法分析复杂度稳定性使用场景1.5优化—— 折半插入排序(Binary Insertion Sort)2. 希尔排序(Diminishing Increment Sort)2.1 算法描述2.2算法演示2.3代码实现2.4增量序列2.5算法分析稳定性适用场景3. 冒泡排序(Bubble Sort)3.1算法描述3.2算法演示3..._分类算法

读写parquet格式文件的几种方式_parquet 读写-程序员宅基地

文章浏览阅读6w次,点赞6次,收藏28次。摘要本文将介绍常用parquet文件读写的几种方式1.用spark的hadoopFile api读取hive中的parquet格式文件2.用sparkSql读写hive中的parquet格式3.用新旧MapReduce读写parquet格式文件读parquet文件首先创建hive表,数据用tab分隔create table test(name string,ag..._parquet 读写

ros 安装及卸载 gazebo7/8/9,gazebo版本升级与降级_如何把自己gazebo版本降低到9.0.0-程序员宅基地

文章浏览阅读6.6k次,点赞20次,收藏81次。rqtsudo apt-get install ros-kinetic-rqtsudo apt-get install ros-kinetic-rqt-common-pluginsgazebo安装gazebo7,sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-controlGazebo模型的加载需要连接国外网站,为了保证模型顺利加载,可以提前将模型文件下载并放到本地路径~/.gazebo/mo._如何把自己gazebo版本降低到9.0.0

近期项目设计知识点总结:flex布局、canvas、引入外部字体、rem、匹配选择器等_vue flex布局canvas-程序员宅基地

文章浏览阅读634次。一、伪类、伪元素锚伪类 a:link a:visited a:hover a:active分别是链接未访问时,链接被访问过后,鼠标悬停在链接上,鼠标点击链接那一瞬间,需按顺序设置二、js禁止移动端页面滑动①、position:fixed②、$(document).on('touchmove',function(e){e.preventDefault();})//_vue flex布局canvas

ElasticSearch安装为Windows服务_elasticsearch 安装 windows 服务-程序员宅基地

文章浏览阅读667次。转载地址:https://www.cnblogs.com/Percy_Lee/p/8960991.html目前我都是在windows的环境下操作是Elasticsearch,并且喜欢使用命令行启动时通过cmd直接在elasticsearch的bin目录下执行elasticsearch这样直接启动的话集群名称会默认为elasticsearch,节点名称会随机生成。停止就直接在cmd界..._elasticsearch 安装 windows 服务

4位加法器的设计代码verilog_用verilog设计4位顺序脉冲发生器-程序员宅基地

文章浏览阅读1.6k次。顺序脉冲发生器又称脉冲分配器,它将高电平脉冲依次分配到不同的输出上,保证在每个时钟周期内只有一路输出高电平,不同时钟上的高电平脉冲依次出现在所有输出端。以4位顺序脉冲发生器为例,它有4路输出S0、S1、S2、S3,每路输出上高电平脉冲依次输出在1000、0100、0010、0001之间循环。4位顺序脉冲发生器的状态转移图如图由4个状态构成,每个状态中“1”的个数都是1个,表示每个时钟周期内只有一路..._顺序脉冲发生器状态转换图

推荐文章

热门文章

相关标签