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接口: 接口…

理解 redis 中的 哈希对象类型

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

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

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

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…

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…

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开发手册》读后感,之前自学时由于没怎么接触过打“日志”,所以《手册》中的“日志…

在 k8s 中部署 Prometheus 和 Grafana

部署 Prometheus 和 Grafana 到 k8sIntro上次我们主要分享了 asp.net core 集成 prometheus,以及简单的 prometheus 使用,在实际在 k8s 中部署的时候就不能在使用前面讲的静态配置的方式来部署了,需要使用 Prometheus 的服务发现。部署规划Pr…

EntityFramework Core 5.0 VS SQLBulkCopy

【导读】EF Core 5.0伴随着.NET 5.0发布已有一段时日,本节我们来预估当大批量新增数据时,大概是多少区间我们应该考虑SQLBulkCopy而不是EF CoreSQLBulkCopy早出现于.NET Framework 2.0,将数据批量写入利用此类毫无疑问最佳,虽其来…

小心使用 Task.Run 续篇

关于前两天发布的文章:为什么要小心使用 Task.Run,对文中演示的示例到底会不会导致内存泄露,给很多人带来了疑惑。这点我必须向大家道歉,是我对导致内存泄漏的原因没描述和解释清楚,也没用实际的示例证实,是…

java实用教程——组件及事件处理——设置组件的位置(相对于窗口具体位置和布局)

1: 相对于窗口的具体位置 关键点: JButton组件添加到JPanel时,如果想自己位置,需要对JPanel进行如下设置,才能自定义按钮位置 需要将组件添加到画板上去,才可以设置组件的相对具体位置 button1.setBounds…