目录

1、留存率cohort介绍及其业务价值

2、计算思路

3、实操

3.1、日对日留存cohort

3.2、周对周留存cohort

3.3、月对月留存cohort


1、留存率cohort介绍及其业务价值

留存率cohort也叫做同期群留存分析,将同一时间范围内的用户分为一组,计算这批人在之后的留存情况,一般结果的样式如下(这里省略数值,):

新增留存

日期 新增客户数 次1日留存 次2日留存 次3日留存 ....
20220101 1000 50% 40% 39%
20220102 981 59% 50%
20220103 819 61%

老客留存(数据略)

日期 老客户数 次1留存 次2留存 次3留存 ....

根据留存cohort图可以得到两方面的信息

1、从横向看,可以得到一批用户在长时间范围内的衰减情况

以上述示例来看:用户在新增后的前两天是快速衰减的(第一天之后有50%的用户不再来了,第三天又损失了40%),到第四天会逐步稳定下来,可见前三天是产品抓住用户的关键窗口期。

2、从纵向看,可以看出不同时间周期来的用户,他们的留存情况是否有改善

以上述示例来看:用户的次日留存在逐步改善(从50%-59%-61%)这可能是产品上做了优化调整,也可能是投放侧在用户的选择上更精准了(对应的用户新增数量也在减少)

2、计算思路

如果通过SQL得到留存cohort数据呢?

Step1:计算留存率分母数据,即每日的用户量

通常来说,新老用户的留存率差异是非常大的,所以需要进行区分。有现成的用户标签是最好的,如果没有可以用窗口函数计算用户是第几次来,第一次来的用户就是当日新增用户。

step2:计算留存率分子

这里计算的间隔时间可以是日,周,月各种时间粒度

关于SQL时间计算的相关知识点可以参考:

SQL-时间处理汇总_格勒王的博客-CSDN博客常见日期提取,日期格式转换,日期加减计算等时间处理方法汇总https://blog.csdn.net/weixin_47198715/article/details/130823960?spm=1001.2014.3001.5502

日期 间隔时间 留存客户数
20220101 1 500
20220101 2 400
20220101 3 390
20220102 ... ...

step3:将上面两步骤数据合并

3、实操

3.1、日对日留存cohort

with tmp as
(select date,--yyyy-mm-dd格式,如果是yyyymmdd需要转换user_id
from table_name
where is_new=1#筛选新用户
)select
a.date,
gap,
`客户数`,
`留存客户数`,
round(`留存客户数`/`客户数`,2) as `留存率`
from (--计算留存率分母SELECT DATE,COUNT(DISTINCT user_id) AS `客户数`FROM  tmpGROUP BY DATE)a--计算每日新增客户数
LEFT JOIN (--计算留存率分子SELECTbegin_date,gap,count(distinct user_id) as `留存客户数`from (SELECTa.user_id,a.date as begin_date,b.date as stay_date,datediff(b.date,a.date)as gap--计算间隔天数from (select *from tmp)aleft join (select *from tmp)bon a.user_id=b.user_id)awhere gap>=1--筛选间隔天数大于等于1的记录group by begin_date,gap)b
on a.date=b.begin_date

3.2、周对周留存cohort

和日对日留存的区别在于,日对日留存只需要计算两次日期的间隔天数即可

而周对周的留存需要计算两个日期的间隔周

有两种方法可以实现周对周留存率的计算

1、先把每天的日期对应到当周的周一,再计算周一之间的日期差除以7

2、使用weekofyear函数,但是这里如果涉及到跨年,需要在处理的时候注意

weekofyear('yyyy-mm-dd')

两个日期周数相差:公式:(52-新增周)+(留存日年份-新增日年份)*留存日周数

如2022年第51周新增的用户,在2023年第1周的留存,计算两个日期的周数差:

(52-51)+(2023-2022)*1=2(也就是次2周留存)

我们以第一种方法示例


with tmp as
(select date,--yyyy-mm-dd格式,如果是yyyymmdd需要转换date_add(DATE,2-if(dayofweek(DATE)=1,8,dayofweek(DATE))) as monday,user_id
from table_name
where is_new=1#筛选新用户
)select
a.monday,
gap,
`客户数`,
`留存客户数`,
round(`留存客户数`/`客户数`,2) as `留存率`
from (--计算留存率分母SELECT monday,COUNT(DISTINCT user_id) AS `客户数`FROM  tmpGROUP BY monday)a--计算每日新增客户数
LEFT JOIN (--计算留存率分子SELECTbegin_date,gap,count(distinct user_id) as `留存客户数`from (SELECTa.user_id,a.monday as begin_week,b.monday as stay_week,datediff(b.monday,a.monday)/7 as gap--计算间隔周数from (select *from tmp)aleft join (select *from tmp)bon a.user_id=b.user_id)awhere gap>=1--筛选间隔天数大于等于1的记录group by begin_date,gap)b
on a.monday=b.begin_week

3.3、月对月留存cohort

计算两个日期之间的月份差可以使用month_bvetween(date1,date2)函数,但是这里计算出来的月份差非整数,如20230301和20230430之间的月份差也是1

在计算月留存时,我们需要对其向下取整,即floor(month_bvetween(date1,date2))

with tmp as
(select date,--yyyy-mm-dd格式,如果是yyyymmdd需要转换substr(DATE,1,7) AS month,user_id
from table_name
where is_new=1#筛选新用户
)select
a.month,
gap,
`客户数`,
stay_num
from (--计算留存率分母SELECT month,COUNT(DISTINCT user_id) AS `客户数`FROM  tmpGROUP BY month)a--计算每日新增客户数
LEFT JOIN (--计算留存率分子SELECTbegin_date,gap,count(distinct user_id) as `留存客户数`from (SELECTa.user_id,a.month as begin_month,floor(months_between(b.date,a.date))as gap--计算间隔天数from (select *from tmp)aleft join (select *from tmp)bon a.user_id=b.user_id)awhere gap>=1--筛选间隔天数大于等于1的记录group by begin_month,gap)b
on a.month=b.begin_month

SQL-计算留存率cohort相关推荐

  1. 如何用SQL做留存率分析

    背景 APP分析中经常用到AARRR模型(海盗模型)用来分析APP的现状,其中一个重要节点就是提高留存(Acquisition),而留存率这个指标在这个阶段可以说是核心指标也不为过.那如何用SQL计算 ...

  2. mysql 留存_如何用SQL做留存率分析

    背景 APP分析中经常用到AARRR模型(海盗模型)用来分析APP的现状,其中一个重要节点就是提高留存(Acquisition),而留存率这个指标在这个阶段可以说是核心指标也不为过.那如何用SQL计算 ...

  3. 【SQL屠夫系列】- 高频面试之SQL计算用户留存率

    文章目录 指标背景 指标计算 真题 思路 开撸 拓展 在如今的程序员面试过程中,考察SQL部分能力,虽不是难点,但几乎是必考. 为检查思路盲点,避免翻船,各位看官也可以复盘下,如对你有一丝的帮助,欢迎 ...

  4. 如何用 SQL 做留存率分析?

    无论是产品经理.产品运营还是数据分析师,在评估一个产品的用户使用情况时肯定离不开留存率.忠诚度等观测指标.这些指标可以反映用户对于产品的粘性.产品用户价值质量的高低,及时了解用户留存.流失趋势,有助于 ...

  5. 2021_lg_03.SQL实战:如何用sql计算用户留存问题

    如何用sql计算用户留存问题 一.留存 1 .留存的含义: 留存:指基准日到APP的用户在之后的n日当天返回APP的人数: 留存率 = 基准日之后的n天当日返回的用户数 / 基准日的用户数 * 100 ...

  6. sql计算留存_SQL无所不能:DBA宝妈宝爸系列分享

    原文链接:https://www.modb.pro/db/22315 目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿)需求,具体可参考: 使用SQL计算宝宝每次吃奶的时间间隔 - ...

  7. SQL计算宝宝吃奶的时间间隔(二)

    导读:之前,在"数据和云"公众号发表过一篇文章<如何使用SQL计算宝宝每次吃奶的时间间隔(分析函数的使用)>,本文为续篇,如何提升程序的易用性. 因为我工作繁忙,时常不 ...

  8. 如何使用SQL计算宝宝每次吃奶的时间间隔(文末含PPT)

    编者的话:搞好SQL可以做很多事情,比如说可以解决海盗分金的问题,可以用SQL把大象装进冰箱,还可以用SQL解决环环相扣的刑侦推理问题,近期,有位读者朋友投稿了"使用SQL计算宝宝每次吃奶的 ...

  9. oracle 求一年多少天,SQL 计算一年有多少天

    SQL 计算一年有多少天,计算当前年份有多少天. SQL 计算一年有多少天 问题描述 计算当前年份有多少天. SQL 计算一年有多少天 解决方案 计算当前年份有多少天,等同于计算下一年的第一天和当前年 ...

最新文章

  1. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(自定义色彩、形状)实战
  2. QScintilla
  3. 【万字长文详解】Python库collections,让你击败99%的Pythoner
  4. Spring注解编程基石(三)
  5. TensorFlow CIFAR-10数据集
  6. SAP CRM Fiori应用Appointment startup parameters - 启动参数
  7. [CodeForces 1603C] Extreme Extension(贪心 + 数论分块优化dp)
  8. Linux 管理登陆的用户/查看/剔除
  9. 【算法分析与设计】最大连续子序列和问题
  10. hadoop-2.5安装与配置
  11. 转: JavaScript判断浏览器类型及版本
  12. 什么是最佳的视频用户体验?阿里云视频服务四大体验优化实践
  13. 2021腾讯算法大赛
  14. python 获取前几天的日期
  15. 产品硬件成本分析_硬件项目中的错误成本
  16. 打印机相关的c语言程序,VC下打印机的使用
  17. android 文件传输_使用“发送到”轻松将文件传输到您的Android设备
  18. 清华周界详解《基于图神经网络的事实验证》 | 百万人学AI
  19. windows xp下载python3.5.8_Python3.5中文版下载
  20. 武大计算机博士毕业生工资,北航、交大、武大…中国重点大学毕业生工资公布,你达标了吗?...

热门文章

  1. 又是一个名叫草泥马的项目:thefuck--修复错误的命令行扩展
  2. linux 日常工作常用软件(持续更新)
  3. 基于关键词和基于关系链的获取流量方法
  4. 【云原生】Apisix接入Nacos、K8s服务注册中心自动获取服务
  5. 一、重写muduo网络库之服务器编程及测试
  6. c语言brr17,再说。brbr迷糊中,只听身边
  7. 【基础算法】简单了解一下常见的几种散列算法?
  8. JVM详解——什么是JVM、JVM优点
  9. 关于html的一些小知识
  10. 天梯赛:L2-027 名人堂与代金券 (25 分)