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

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

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

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

7bdf053dcaf7510c855f311fd72446f7.png

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

2c1ddecb9c0b0824c702f3baf880d20e.png

    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 )

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

8af6f6d0da63022d62c9fcfdb6ab85d3.png10956830b4461612daa73cc9609531ed.png6340bd81b6df1e30c33fe7fa8e160d25.png

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.客户类别

                            最后得到的结果

72fc2f6efb785d0ac87725fa70febc96.png

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

              没有关注的也可以关注下公众号~再次感谢0b868f21ffc0d69022ebcc7333399d04.png0b868f21ffc0d69022ebcc7333399d04.png0b868f21ffc0d69022ebcc7333399d04.png

f4747835f2b824a4183b05fe9a4dbe67.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实用教程——组件及事件处理——ActionEvent事件

事件源: 文本框,按钮,菜单项,密码框,单选按钮 注册监视器: 能够触发ActionEvent事件的组件使用方法 addActionListener(ActionListener listener) 处理事件接口: ActionListener接口中只有一个方…

【Azure Show】|第七期 特别版线上沙龙直播回顾. 嘉宾张坤段清华谭国欣柯克黄炜锵...

我是MVP 继与广州图书馆合作推出【搭上AI快车】在线公益课堂和大家分享了基于移动应用的人工智能开发经验后,本期继续与广州图书馆合作,邀请更多的微软技术专家,推出我们Azure Show节目的特别版,为大家带来各IT技术领域的经验分享…

java实用教程——组件及事件处理——ItemEvent事件(设置字体类型)

ItemEvent事件源: 选择框,下拉列表都可以触发ItemEvent事件 注册监视器: 能够触发ItemEvent事件的组件使用addItemListener(ItemListener listen) 将实现ItemListener的接口的类的实例注册为事件源的监视器 ItemListener接口: 接口…

python开发一个自己的技术网站_手把手教你写网站:Python WEB开发技术实战

摘要:本文详细介绍了Python WEB开发的基础入门。以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程。通过本文的学习可以快速掌握基于Django的Python WEB的开发方法,进行WEB站点的实践开发。数十款阿里云产品限时折扣中,赶紧…

理解 redis 中的 哈希对象类型

redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用Dictionary存放的话,可以根据场景优先考虑下redis哦,起码可以装装嘛&#xff0c…

java实用教程——组件及事件处理——DocumentEvent事件

DocumentEvent事件源: 文本区Document的维护 注册监视器: 使用addDocumentListener(DocumentListener listen)为事件源添加监视器 DocumentListener接口: 接口中有三个方法: public void changUpdate(DocumentEvent e); public vo…

python递归函数查询表_python---------------递归函数

一、递归的定义1.什么是递归:在一个函数里在调用这个函数本身2.最大递归层数做了一个限制:997,但是也可以自己限制1 deffoo():2 print(n)3 n14 foo(n)5 foo(1)3.最大层数限制是python默认的,可以做修改,但是不建议你修…

prometheus-net.DotNetRuntime 获取 CLR 指标原理解析

prometheus-net.DotNetRuntime 介绍Intro前面集成 Prometheus 的文章中简单提到过,prometheus-net.DotNetRuntime 可以获取到一些 CLR 的数据,比如说 GC, ThreadPool, Contention, JIT 等指标,而这些指标可以很大程度上帮助我们解决很多问题&…

错误代码1500什么意思_啊早安打工人是什么梗???

早安打工人是什么梗?最近打工人这个词成为了大家口中最为常见的一个词语,打工人的爆火也引起了很多人的关注,这样一个词语在很多人看来很有可能还有点嘲讽的含义,却突然火遍全网,究竟打工人是什么梗?看起来…

java实用教程——组件及事件处理——MouseEvent事件

MouseEvent事件 任何组件上都可以发生鼠标事件,如鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发鼠标事件,即导致MouseEvent类自动创建一个 事件对象,事件源注册监视器的方法是addMouseListener(MouseListener listener); …

这个世界,正在悄悄惩罚那些不注意身体的人

这是头哥侃码的第226篇原创上周四,整个网络被 “马拉多纳去世” 的消息刷屏了。虽然我从不看足球,而且没有看过马拉多纳踢球,但关于他的故事、他的传奇、他的丰功伟绩,倒是听过不少。所以在听到这个消息的时候,我感到深…

tcp拥塞控制_网络TCP的拥塞控制算法简介

作为网络中使用最广泛的传输协议,TCP的拥塞控制机制是学术界和工业界关注的焦点问题之。然而,目前广泛使用的TCP传输协议的拥塞控制算法仍然使用相对固定的窗口调节策略,无法根据动态变化的场景自适应地调整参数,从而造成不可避免…

java实用教程——组件及事件处理——对话框(消息对话框,输入对话框,确认对话框)

消息对话框:(这个对话框提供一些信息) 无模式:可多线程的执行 有模式:用户必须处理这个一个对话框。必须解决这个问题后才可以继续相处下去 对话框分为无模式和有模式两种。如果一个对话框 是有模式的对话框,那么当这个对话框处于…

11张图演进SeviceMesh服务网格

本周和大家聊聊架构进化史-大家可文末扫码加入随着互联网持续高歌猛进,相关技术名词也是层出不穷,ServiceMesh服务网格这两年尤为火爆,然而很少有讲清楚的文章。笔者这里用心整理了一篇文章,用11张图演绎ServiceMesh的进化历程&am…

python数据抓取课程_Python爬虫入门教程 21-100 网易云课堂课程数据抓取

写在前面今天咱们抓取一下网易云课堂的课程数据,这个网站的数据量并不是很大,我们只需要使用requests就可以快速的抓取到这部分数据了。 你第一步要做的是打开全部课程的地址,找出爬虫规律,地址如下: https://study.16…

java实用教程——组件及事件处理——对话框(颜色对话框,自定义对话框)

颜色对话框: 可以用javax.swing包中的JColorChooser类的静态方法 public staticColorshowDialog (Component component, String title, Color initialColor) 创建一个有模式的颜色对话框,其中参数component指定颜色对话框可见时的位置,颜色对…

.NET Core/.NET 5.0 析构函数依然有效?

【导读】最近看到小伙伴在.NET Core中用到了析构函数,不禁打一疑问,大部分情况下,即使在.NET Framework中都不会怎么用到析构函数,我想在.NET Core中是否还依然有效呢?随着时间推移,迭代版本更新&#xff0…

如何在 Asp.Net Core 实现 Excel 导出功能

在web应用程序开发时,或许你会遇到这样的需求,如何在 Asp.Net Core 中实现 excel 或者 word 的导入导出,在 NuGet 上有大量的工具包可以实现这样的功能,本篇就讨论下如何使用 ClosedXML 实现 Excel 数据导出。安装 ClosedXML 如果…

java实用教程——常用实用类——String类(字符串类)

JAVA把String类定义为final类(因此用户不能扩展String类,即String类不可以有子类) String对象可以用""进行并置运算 identityHashCode会返回对象的hashCode,而不管对象是否重写了hashCode方法。 public class Example8_1 {public static void…

sqlserver 事务日志 异常增长原因排查_小白入门学习打日志

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y记得之前写过一篇:《阿里巴巴 Java开发手册》读后感,之前自学时由于没怎么接触过打“日志”,所以《手册》中的“日志…