如何用sql计算用户留存问题

一、留存

1 .留存的含义:

留存:指基准日到APP的用户在之后的n日当天返回APP的人数;

留存率 = 基准日之后的n天当日返回的用户数 / 基准日的用户数 * 100%

或者指基准日产生某个行为的用户在之后的第一天,第二天,第三天……第n天的当天再次产生该行为的 人数。

2.留存的意义

留存代表一个用户愿意再次使用你的产品;而一个产品能够被用户再次使用,意味着这个产品是能够满 足用户长期需求的,能够让用户产生一定粘性的产品。

如今互联网产品大多为免费产品,依靠持续的广告转化、用户持续的购买转化、用户持续的会员付费来 维持收益。

那么,怎样才能达到持续的广告转化?持续的购买转化?持续的会员付费?

广告转化、购买、会员付费,我们都需要用户来完成。那么持续的广告转化、购买、会员付费,我们就 需要每天都有一定量的用户来完成以上过程,也就是说我们需要我们的产品每天都是有活跃用户的。

那么从活跃用户的构成,我们就知道怎么维持我们的活跃用户规模:一方面持续有新用户流入,另一方 面持续有留存用户留存;

那么为什么留存用户重要?部分有过从业经验的同学应该知道,产品的自然新增用户是比较少的,如果 我们仅靠产品自然用户增长,那么必然我们的活跃用户量级会非常小,虽然能够获得收益,但是这部分 收益很可能养不起我们的公司;但是如果我们想要用购买新用户的方式获得持续的较大规模的用户池, 又会产生比较大的成本,这样做容易亏本。所以我们需要新增留存两手抓;想方设法留住我们新增的用 户,让其长期地在我们的产品内产生价值,这样做,比起单做新增,在成本和效果上都是要好的。

3.留存的实际应用

留存的主要应用场景有两个:
一个是产品整体视角的持续留存情况;也就是我们需要定期分析用户在产品的留存是否维持在一个正常 的范围,有没有突然地涨跌情况,如果有的话问题出在哪里,为什么会出现这样的问题,如何解决留存 异常的问题。遇到这类问题首先需要确定的是整体用户的留存异常还是个别群体用户的留存异常,如果 是整体用户的留存异常,我们需要分析我们的产品是否发生异常,可以通过用户的行为路径确定异常产 品位置;如果是个别用户的留存异常,需要通过用户拆解的方法来定位有异常的用户群体,然后通过这 类用户的特征来分析问题原因;

一个是新增用户视角的每批新增用户留存情况。一般出现在计算投放ROI的场景,也就是我们投放一批 用户,能够给我们带来多少收益。我们会用这些用户的“整个生命周期能够带来的收入”(LTV)去除以 “投放时的支出”来计算我们的ROI。“整个生命周期能够带来的收入”计算的是引入一批新用户,当用户完 全流失时,这部分用户所带来的所有收入。但是有时我们需要提前预估新用户在整个生命周期能够带来 的收入,我们就需要首先用留存来估计用户的生命周期,然后用估计出的生命周期再去计算用户的整个 生命周期能够带来的收入。

4.什么企业不关心留存

需要用户产生持续活跃,持续转化,持续消费的企业都关心用户的留存。那么,什么样的企业不关心用 户留存?

部分线下企业存在数据难以获取的问题,所以对留存关注比较少,比如线下的商场,除非用户产生购买 行为,否则很难探知用户在什么情况下有回流;
部分存在一锤子买卖的企业也不太关心留存,比如说用户在一次买断商品后再也不会产生后续购买或价 值转化行为,这类企业也不怎么关注留存。比如PC单机游戏;比如一次付费的工具类产品(线上线下类 工具都存在这个情况);

问题:

1.计算某APP的每日留存数据。用SQL分解留存计算,每步用视图建立
如何计算留存:

首先我们的目的是建立如下的留存表:“用户每日留存率统计表”

大家可以看到这个留存表由以下几个字段构成:

dates_a 计算留存的基准日日期。这个基准日可以为任意一天,如果基准日就是今天,也就是没有“之后 的第一天”、“之后的第二天”……等等天的数据,那那几天的留存可以以0、或者空值代替;

device_v 基准日当日的活跃用户数。不同产品的活跃用户定义不同,在这里,我们将活跃用户定义为在 当天有过打开APP的用户;

day_1 次日留存率,也就是“基准日之后的第一天”的用户的回访比例。

day_2 2日留存率,也就是“基准日之后的第二天”的用户的回访比例。

day_3 3日留存率,也就是“基准日之后的第三天”的用户的回访比例。

day_7 7日留存率,也就是“基准日之后的第七天”的用户的回访比例。
也就是说:这个表格,表达的是:每天对应多少活跃用户,每天的活跃用户对应的次留率、2日留率、3 日留率、7日留率是多少。我们能从这个表格中可以看出我们产品的用户活跃程度,以及产品对当日活跃 用户的短期、长期粘性情况。

而我们的原数据,长这样:

是一个每日app活跃用户表。其字段分为两列:

user_id 即当日活跃的用户的id

dates 即用户活跃的日期
那我们如何能够根据这个“每日活跃表”,做出上面那个“用户每日留存率统计表”呢?
关键的两个步骤:

  1. 我们需要将每日活跃的用户数据与之后几日该用户的活跃数据连接起来;这样,我们就能知道这个
    用户在之后的哪一天有回访行为;

  2. 通过SQL的数据列联功能,也就是“聚合函数(case when 条件)"的方式,将满足“基准日之后的第一
    天”、“基准日之后的第二天”……的用户数据统计出来,最后再通过基准日的用户数,计算用户留存
    率;

之后,就是引导大家如何将以上两个过程实现。

1.0.建立用户活跃日期表(5分)

表名:temp_user_act

字段:

字段名 字段类型 字段说明

user_id int 用户id

dates date 活跃日期
1.1.用用户活跃日期表做自连接,连接方式使用左连接,连接字段使用“用户id”字段,保留两表的用户id 与两表的日期(20分)

/*
1.1.用用户活跃日期表做自连接,连接方式使用左连接,连接字段使用“用户id”字段,保留两表的用户id 与两表的日期(20分) */DROP TABLE if EXISTS temp_user_act;
CREATE TABLE temp_user_act(
user_id int COMMENT '用户id',dates date COMMENT  '活跃日期' );--
CREATE VIEW temp_user_act_view_tem as
SELECT a.*,b.dates  dates_2 FROM temp_user_act a
LEFT JOIN temp_user_act  b on a.user_id=b.user_id;

1.2.筛选出右表日期大于或等于左表日期的内容(20分)

-- 1.2.筛选出右表日期大于或等于左表日期的内容(20分)
CREATE VIEW temp_user_act_view_tem_2 as
SELECT * FROM temp_user_act_view_tem
WHERE dates_2>dates;

1.3.计算以左表日期为基准日的当日用户数,第二日回访用户数,第三日回访用户数,第四日回访用户 数,第八日回访用户数;(20分)

提示
提示:

datediff(B,A)=1 表示日期B为日期A之后的一天。

count(distinct case when datediff(B,A)=1 then uid else null end) 或者 count(distinct if(
datediff(B,A)=1,uid,null)) 就是求出“日期B为基准日A之后的第一天”的用户数计数

SELECT
dates,
count(user_id) device_v,
count(distinct case when datediff(dates_2,dates)=1 then
user_id else null end) day_1,
count(distinct case when datediff(dates_2,dates)=2 then
user_id else null end) day_3,
count(distinct case when datediff(dates_2,dates)=3 then
user_id else null end) day_4,
count(distinct case when datediff(dates_2,dates)=7 then
user_id else null end) day_8FROM  temp_user_act_view_tem_2
GROUP BY dates ORDER BY dates;

1.4.利用上述数据计算出每日的当日用户数以及次日留存率,二日留存率,三日留存率,7日留存率(率需 要使用百分比表示结果);(在下一部分的案例中,我们会给大家介绍一个一次性完成的留存计 算方法,给大家加深留存计算的印象。)

SELECT dates,device_v,
CONCAT(ROUND((day_1/device_v)*100,2),"%") day_1,
CONCAT(ROUND((day_3/device_v)*100,2),"%") day_2,
CONCAT(ROUND((day_4/device_v)*100,2),"%") day_3,
CONCAT(ROUND((day_8/device_v)*100,2),"%") day_7
FROM temp_user_act_view_tem_3;

1.5(拔高思路)*.求出每日的次留与次留的周环比;

注:
周环比:周环比适用于以周为周期变动的数据,用于观察每天的数据较上周同一天的数据变化。
现有互联网数据多以周为周期变动,一周内每一天的数据都有其特点:

如工作类APP,周一会是每一周的高峰,然后向周五逐渐递减,周五到周六又会有一个锐减的过 程,周日与周六趋于平缓; 如娱乐类APP,周一会较周末锐减,然后向周四逐渐递减,周五会有一个跃升的过程,周六会再次 跃升,周日会较周六下降;

一般遇到这样的变动趋势,如果单纯的分析每一天较上一天的变动情况,就容易分析出错误结论。所 以,在我们分析带有周期类数据时,一定要先将周期提炼出来,使用周期的环比数据做分析,会得出更 有价值,更加准确的结论。

1.计算方式:

假如今日为周一,那么周环比=(本周一数据 - 上周一数据) / 上周一数据 * 100%
2.没有上周对应日期的数据的部分可以为空;


--  假如今日为周一,那么周环比=(本周一数据 - 上周一数据) / 上周一数据 * 100%
CREATE VIEW temp_user_act_view_tem_week_1 as
SELECT *,WEEK(dates) week_1,WEEK(dates_2) week_2 FROM  temp_user_act_view_tem_2;CREATE VIEW temp_user_act_view_tem_week_P as
SELECT
WEEK_1,
count(DISTINCT user_id) WEEK_count  ,
count(distinct case when week_2-week_1=1 then
user_id else null end) week_p
FROM temp_user_act_view_tem_week_1
GROUP BY WEEK_1 ORDER BY week_1
;SELECT WEEK_1,WEEK_count ,
CONCAT(ROUND((week_p/WEEK_count)*100,2),"%") week_p
FROM temp_user_act_view_tem_week_P;

二(拔高)作者活跃行为统计

如今的大多数内容APP都是以平台模式运营的。

什么叫做平台模式?
比如我们现在能接触到的大多数内容产品“抖音”、“Bilibili”、“微博”、“今日头条”等等。我们使用到的这个 APP,是由APP的制作公司提供的,也就是这个APP会有几个主要的页面,每个页面怎么引导用户进入内 容页面,播放内容的方式有哪些、内容间切换会用什么方式等等,都是我们的APP制作公司决定的;而
我们在这个APP里看到的大多数内容,都是由内容作者提供的。

为了能够让我们的平台能够有持续的内容产出,我们就需要分析作者的活跃行为。主要为我们的作者运
营提供有力帮助。一方面让我们找出活跃作者,增加政策扶持;一方面让我们找到快要流失的作者,及
时召回这部分作者、挽回损失。

某短视频公司有作者发布视频统计表如下:
表名:temp_author_act

字段:

字段名 字段类型 字段说明

dates date 发布日期

author_id varchar(5) 作者id
2.1.请求用SQL出作者的最近三个月内的最大断更天数、平均断更天数和最大持续更新天数;(5分) 名词解释:
持续更新天数:如果一个作者在某几天中每一天都有更新,那么这段时间的天数称为这个作者的持续更 新天数。
断更天数:如果一个作者两次更新中间隔了几天没有更新,那么这几天的天数称为这个作者的断更天
数。

 --  请求用**SQL**出作者的最近三个月内的最大断更天数、平均断更天数和最大持续更新天数;(**5**分)
DROP view if EXISTS temp_author_act_1;
CREATE view temp_author_act_1 as
SELECT
a.author_id,
dates,LEAD(dates,1) over(PARTITION by author_id ORDER BY dates) lead_1  FROM temp_author_act  as a;DROP view if EXISTS temp_author_act_2;
CREATE view temp_author_act_2 as
SELECT
author_id,
MONTH,
max(月最大断更更新天数) over(PARTITION by author_id ORDER BY MONTH rows BETWEEN 2 preceding AND current ROW)  三月内最大断更更新天数,
sum(月最大断更更新天数总和) over(PARTITION by author_id ORDER BY MONTH rows BETWEEN 2 preceding AND current ROW)  /
sum(月最断更更新天数数量) over(PARTITION by author_id ORDER BY MONTH rows BETWEEN 2 preceding AND current ROW)  平均断更天数,
max(月最大连续更新天数) over(PARTITION by author_id ORDER BY MONTH rows BETWEEN 2 preceding AND current ROW)  三月内月最大连续更新天数
FROM(
SELECT
author_id,
MONTH,
max(case WHEN  DATED_IFF=1 then DATED_IFF_sum end) 月最大连续更新天数,
max(case WHEN  DATED_IFF!=1 then DATED_IFF_sum end) 月最大断更更新天数,
sum(case WHEN  DATED_IFF!=1 then DATED_IFF_sum end) 月最大断更更新天数总和,
count(case WHEN  DATED_IFF !=1 then DATED_IFF_sum end) 月最断更更新天数数量
from(SELECT author_id,dates,lead_1,MONTH,DATED_IFF,sum(DATED_IFF) over(PARTITION by author_id,MONTH,dated_iff ORDER BY dates) DATED_IFF_sumFROM (SELECTauthor_id,dates,lead_1,LEFT(dates,7) MONTH,DATEDIFF( lead_1, dates ) DATED_IFFFROMtemp_author_act_1 WHERE DATEDIFF( lead_1, dates ) >=1 ) a )bGROUP BY author_id,MONTH) c;SELECT
author_id,
MONTH,
三月内最大断更更新天数,
平均断更天数,
if(ISNULL(三月内月最大连续更新天数),0,三月内月最大连续更新天数) 三月内月最大连续更新天数 FROM temp_author_act_2;

2.2.运营人员需要对作者做电话访问,需要你用SQL求出每位作者在最大断更天数时对应的日期范围。
用于访问该日期内的断更原因。(5分)


-- 2.2CREATE view temp_author_act_1 as
SELECT
a.author_id,
dates,LEAD(dates,1) over(ORDER BY dates) lead_1  FROM temp_author_act  as a;SELECT a.author_id, max_DATED_IFF ,time_to FROM (SELECTauthor_id,max(DATEDIFF( lead_1, dates )) max_DATED_IFF FROMtemp_author_act_1 GROUP BYauthor_id ) a
LEFT JOIN (SELECTauthor_id,CONCAT(dates,'———',lead_1) time_to,DATEDIFF( lead_1,dates ) DATED_IFF
FROM temp_author_act_1) b on a.author_id=b.author_id and a.max_DATED_IFF =b.DATED_IFFORDER BY max_DATED_IFF desc;

2021_lg_03.SQL实战:如何用sql计算用户留存问题相关推荐

  1. 一种计算用户留存的方法

    0x00 概述 用户留存分析是互联网时代常用的一种数据分析方法.而很多快速发展的公司并没有相应的方法论沉淀,这就导致了在计算用户留存的时候会出现下面的一些问题:1)用户留存的定义不明确,不同的研发有自 ...

  2. SQL实战篇:SQL解决近X天的问题

    在面试和实际项目中,我们经常会遇到这样两类问题,即以时间为轴线,沿着时间轴分析过去一段时间的用户特征或者行为. 一类是根据用户第一次访问的时间统计最近N天的行为特征,称之为近X天问题:另一类是根据用户 ...

  3. SQL实战篇:SQL解决连续X天的问题

    上一节内容,通过用户留存率的案例,讲解了解决近X天问题的思路,接下来,在本节内容来看看关于连续X天的问题,该类问题是面试和实际业务中经常需要解决的问题. 首先对连续指标.做个定义,如下: 1日连续:当 ...

  4. SQL实战篇:SQL优化问题

    本节内容,讲一个非常重要的知识点,关于SQL的优化问题,很多数据分析师经常会遇到一个问题,一个简单的数据分析,明明只要花1-2分钟就可以完成,但是跑数却需要花费几十分钟到几小时不等,这个时候提升SQL ...

  5. SQL实战篇:SQL窗口函数及真题

    在数据分析师面试笔试过程中,窗口函数是各大公司笔试题中高频出现的知识点,因为在实际工作中,很多涉及到组内排名或求topN等相关的问题,都有一个共同的特点,实现起来不是简单的表连接或者聚合函数就可以完成 ...

  6. SQL实战篇:SQL行列转换及真题

    对于数据分析师来说,日常进行SQL分析和制作报表的过程中,经常会遇到通过SQL进行行列转换的需求,本节内容对常见的行列转换进行了总结,常见的行列转换包括以下四种情况: 列转行 行转列 列转换成字符串 ...

  7. SQL实战篇:SQL基础及执行顺序

    对于数据分析师来说,不管什么行业,大多数岗位要求都需要熟练使用SQL,尤其在互联网行业要求更是严格,海量的数据存储在数据库中,不懂SQL就寸步难行,更何谈数据分析了,而写的一手好SQL,却可以让自己提 ...

  8. php计算用户留存,利用Python计算新增用户留存率

    原始数据:创角日志和登录日志 导入需要的库 pandas import pandas as pd 1.获取数据 #读取创角日志 df_create = pd.read_csv(r'F:\Python\ ...

  9. Flink 1.9 实战:使用 SQL 读取 Kafka 并写入 MySQL

    上周六在深圳分享了<Flink SQL 1.9.0 技术内幕和最佳实践>,会后许多小伙伴对最后演示环节的 Demo 代码非常感兴趣,迫不及待地想尝试下,所以写了这篇文章分享下这份代码.希望 ...

最新文章

  1. 微信小程序获取openid和session_key并且把openid存入数据库
  2. [译] iOS 开发之新版 APNs 搭建必备知识
  3. 在巴塞罗那,华为挥别昨日 | MWC 2019
  4. php 匹配多行,PHP-选择与相关表中的多行匹配的行
  5. 鸿蒙自研系统,华为已注册“华为鸿蒙”商标,自研操作系统最快秋季发布
  6. 计算机一级应用基础选择题,计算机应用基础一级考试选择题
  7. 35岁学嵌入式合适吗_什么是嵌入式技术?
  8. 直播预告丨云时代的数据库客户端——CloudQuery最佳实践
  9. linux 串口中断_1600字干货 | 大佬讲Linux启动流程(内含福利)
  10. VS编译错误与链接错误汇总
  11. 前端工具,网址推荐,方便开发,学习。
  12. understanding OpenGL
  13. Xshell正版免费,再也不用找破解版了!
  14. 改之理java文件_apk改之理反编译错误,来大神
  15. 普适计算-2014/03/28
  16. Struts2漏洞爆发 知道创宇云安全已拦截近万攻击样本
  17. 2019年第十届蓝桥杯c/c++B组国赛决赛真题题目
  18. 【学习笔记】无限极分类学习
  19. line-height的理解
  20. Caused by: java.lang.IllegalArgumentException报错

热门文章

  1. 华为如何在开发者选项观察错误日志_爬虫scrapy框架--log日志输出配置及使用
  2. 大神级DIY作品:运动跟随大眼睛,软件硬件结构一个都不能少
  3. 自动生成目录和参考文献上标
  4. typename的起源与用法
  5. [openwrt]coredump设置
  6. 什么是灰度发布,以及灰度发布A/B测试
  7. Angular Landing – Material Design Angular App Landing Page
  8. Qt开发-QT Widgets
  9. 刚刚才发现,原来这四款软件可以厉害到这种程度
  10. Android学习之——操作SIM卡联系人