最近,好几个小伙伴都拿着关于用户留存的面试题来问我,所以今天单独开一篇文章讲一下留存问题。

首先看一下留存是什么,简单来说,我和你今天在一家超市购物了,明天我来购物了,你没来,那么我就是这个超市的留存用户。就是在设定的时间间隔都进行购物的客户,一般是计算七日留存,就是七天后谁来购物了。

接着我们看题目,我就直接上原图了:

1.看了下表结构,这里我也构造了一些数据 :

2.看他的需求,

第一步是进行了三个判断,头部,尾部,和腰部,定义是上个月的不同消费额。

第二步是留存的概念,上个月消费了,这个月也消费了,看到这里,同学们应该都想到了关联。

第三步是定义了上个月和这个月的概念,这个很重要。

3.我们开始做,看到结果集和金额没有关系,只是中间需要转换成不同客户层,所以我拆开来看,先给他 判断好他的消费额

t_6 as (select 客户名称,   ---计算上月消费用户和他的类别       case         when sum(消费金额) > 30000 then          '头部客户'         when sum(消费金额) > 10000 then          '腰部客户'         else          '尾部客户'       end as 客户类别  from 消费表 where 消费日期 between date '2020-06-01' and date '2020-06-30' group by 客户名称 having sum(消费金额)>0))
t_7 as (select 客户名称   --对本月消费用户进行去重  from 消费表 where 消费日期 between date '2020-07-01' and date '2020-07-31' group by 客户名称 having sum(消费金额)>0)
t_g(select '头部客户' as 客户类别 from dual --构造一个客户类别表,防止少数据union allselect '腰部客户' as 客户类别 from dual union allselect '尾部客户' as 客户类别 from dual )

这三段代码分别可以得到下面数据

select tg.客户类别,   --最后将他们关联起来即可       count(t6.客户名称) as 用户量,       count(t7.客户名称) as 留存用户  from t_g tg  left join t_6 t6    on tg.客户类别 = t6.客户类别  left join t_7 t7    on t7.客户名称 = t6.客户名称 group by tg.客户类别
---总的代码如下:with 消费表 as(select '张三' as 客户名称,date'2020-06-01' as 消费日期,10000 as 消费金额 from dual union allselect '张三' as 客户名称,date'2020-06-09' as 消费日期,25000 as 消费金额 from dual union allselect '李四' as 客户名称,date'2020-06-10' as 消费日期,28000 as 消费金额 from dualunion allselect '王五' as 客户名称,date'2020-06-30' as 消费日期,38000 as 消费金额 from dualunion allselect '李四' as 客户名称,date'2020-07-10' as 消费日期,680 as 消费金额 from dualunion allselect '李四' as 客户名称,date'2020-07-15' as 消费日期,6800 as 消费金额 from dualunion allselect '王五' as 客户名称,date'2020-07-25' as 消费日期,3850 as 消费金额 from dualunion allselect '马六' as 客户名称,date'2020-07-31' as 消费日期,2900 as 消费金额 from dual),t_6 as (select 客户名称,       case         when sum(消费金额) > 30000 then          '头部客户'         when sum(消费金额) > 10000 then          '腰部客户'         else          '尾部客户'       end as 客户类别  from 消费表 where 消费日期 between date '2020-06-01' and date '2020-06-30' group by 客户名称 having sum(消费金额)>0) ,t_7 as  (select 客户名称  from 消费表 where 消费日期 between date '2020-07-01' and date '2020-07-31' group by 客户名称 having sum(消费金额)>0),t_g as (select '头部客户' as 客户类别 from dual union allselect '腰部客户' as 客户类别 from dual union allselect '尾部客户' as 客户类别 from dual )select tg.客户类别,       count(t6.客户名称) as 用户量,       count(t7.客户名称) as 留存用户  from t_g tg  left join t_6 t6    on tg.客户类别 = t6.客户类别  left join t_7 t7    on t7.客户名称 = t6.客户名称 group by tg.客户类别

最后得到的结果

  感觉还不错的话,点下在看鼓励一下作者吧  

没有关注的也可以关注下公众号~再次感谢

sql计算留存_SQL基础第七讲:关于用户留存率的计算相关推荐

  1. 小白都能学会的Python基础 第七讲:综合实战3 - 文字识别、人脸识别实战

    1.华小智系列 - Python基础(案例版) <Python基础>目录 第七讲:综合实战3 - 文字识别.人脸识别实战 1.Python图片文字识别(OCR) 2.Python人脸识别( ...

  2. hive 关于用户留存率的计算

    最近接到一个需求,需要统计用户留存率,而且要一次统计多个模块,多个日期的留存率,那如何通过一段hive(SQL)来实现该需求呢,在网上看到一篇很精妙的文章,参考这篇文章实现了需求,可以说是目前见过的一 ...

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

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

  4. HTML基础第七讲---框架

    转自:https://i.cnblogs.com/posts?categoryid=1121494 框架(Frame)也就是所谓的分割窗口.分割画面.框窗效果(还真是五花八门),这个技巧在运用上问题比 ...

  5. Python基础--第七讲 列表

    1 序列(sequence) 序列是Python中最基本的一种数据结构.序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索引)并且序列中的数据会按照添加的顺序来分配索引 数据结构指 ...

  6. 第七讲:用户和用户组管理

    [7.1.用户配置文件分为三种] 1 - 用户信息文件/etc/passwd 为什么要介绍配置文件(与linux的用户管理有关)?与windows的用户管理不同,windows下只有一个用户,而在li ...

  7. 用户留存率问题计算详解

    数据分析工作中经常会遇到计算用户留存的相关问题,例如我们现在遇到这样一个场景, 某APP, 它的新增用户的次日留存.7日留存.30日留存为60%.30%.15%, 请模拟出来,每天如果日新增5万用户, ...

  8. 两个运放制作加法器_运放基础第10讲,加法器、减法器、积分器、微分器、仪表放大器...

    运放基础第10讲,加法器.减法器.积分器.微分器.仪表放大器课程介绍 <运放第2部,运放电路设计实战基础视频> 课程介绍:<运放电路设计基础视频教程>的第一部分内容有三分之一到 ...

  9. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-对极几何和对极约束、本质矩阵、基础矩阵

    专栏系列文章如下:  专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLA ...

最新文章

  1. 群晖 emby_NAS上安装emby,打造家庭媒体中心
  2. java实现打印直角三角形
  3. Oracle面对“数据倾斜列使用绑定变量”场景的解决方案
  4. clickhouse大数据分析技术与实战_比Hive快500倍!大数据实时分析领域的黑马
  5. 同步代码时忽略maven项目 target目录
  6. linux emule 编译 wx-config --libs,Linux下的wxWidgets静态编译实现方法
  7. CSS3实现轮播图效果
  8. 从3000元月薪码农到首席架构师的经历
  9. linux之cenos7修改ip(临时和永久)
  10. DirectX修复工具使用技巧之二——手动修复C++创建失败的文件
  11. 制作TTF格式的字体
  12. Eclipse常用插件推荐
  13. Ubuntu安装teamviewer12
  14. centos安装git时出错提示make[1]: *** [perl.mak] Error 2 make: *** [perl/perl.mak] Error 2
  15. 微信商城 开发的准备工作
  16. Linux的实时监测命令(watch)
  17. js 事件(绑定、解绑、三个阶段、相关方法)
  18. HTML CSS学习总结
  19. FileTool.exe 替换打开和添加到项目在 Visual c + + 中的功能
  20. 修改Springboot启动图案修改

热门文章

  1. 微服务架构师的职责——《微服务设计读书笔记》
  2. 综述:编程语言的发展趋势及未来方向
  3. ASP.NET Core Docker部署
  4. linux 下 mysql默认表_linux环境下mysql默认是区分表名大小写的
  5. Flutter之点击按钮打开百度链接
  6. linux之which命令
  7. 《看聊天记录都学不会C语言?太菜了吧》(11)2分钟领悟数组
  8. Python turtle库实现基本剖析
  9. python中sendkeys.sendkeys_python的webbrowser模块和SendKeys模块
  10. python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算