php统计用户留存脚本,SQL 统计用户留存

问题描述

有一个用来记录每日客户消耗数据的表 t,它的表结构如下:

字段

类型

描述

created_day

Date

消耗日期

customer_id

Integer

客户ID

amount

Integer

消耗金额

要求:

统计出头部客户、腰部客户、尾部客户在上个月(2020-06-01 ~ 2020-06-30)的留存情况。

输出结果的格式:

层级

客户数量

留存数量

头部客户

腰部客户

尾部客户

数据定义:

头部客户:上个月消耗金额大于等于 30000 的客户;

腰部客户:上个月消耗金额在 10000 ~ 30000(不包含 30000) 的客户;

尾部客户:上个月消耗金额小于 10000 的客户;

留存:最近两个月(上个月和本月)消耗金额大于 0 的客户;

时间:上个月(2020-06-01 ~ 2020-06-30)、本月(2020-07-01 ~ 2020-07-31)

解决方案

今天这个问题和我上一篇文章里面的问题很相似,只不过这里要求多统计一列,因此,解决的思路也差不多。

下面我将用 CTE 来演示每个步骤。

第一步,计算出上个月每个客户的消耗金额。

with t1 AS

(SELECT

customer_id,

SUM(amount) AS amount

FROM

t

WHERE created_day BETWEEN '2020-06-01'

AND '2020-06-30'

GROUP BY customer_id)

SELECT * FROM t1

第二步,在第一步的基础上,统计头部客户、腰部客户、尾部客户的数量。

t2 AS

(SELECT

CASE

WHEN amount >= 30000

THEN 1

WHEN amount >= 10000

THEN 2

ELSE 3

END AS customer_level,

COUNT(*) AS customter_cnt

FROM

t1

GROUP BY customer_level)

SELECT * FROM t2

在脚本中使用代码 1、2、3 分别表示头部客户、腰部客户、尾部客户。

需要注意的是,在 GROUP BY 子句中使用了 SELECT 子句中的字段别名 customer_level,这种语法在其它数据中是编译不通过的。

第三步,计算留存。根据留存的定义,只要客户在本月中有消耗,就计入留存数。比如客户 A,A 上个月的消耗金额是 40000,那么 A 就是头部客户,假如 A 在本月的消耗金额大于 0,A 就为【留存】贡献了 1 。

我们在 t1 之后插入表达式 t12,t12 的脚本如下:

t12 AS

(SELECT

t1.customer_id,

t1.amount,

IF(tmp.amount > 0, 1, 0) AS keep_state

FROM

t1

LEFT JOIN

(SELECT

customer_id,

SUM(amount) AS amount

FROM

t

WHERE created_day BETWEEN '2020-07-01'

AND '2020-07-31'

GROUP BY customer_id) tmp

ON tmp.customer_id = t1.customer_id)

SELECT * FROM t12

t12 中的左连接也可以改造成标量子查询。

完整的 SQL 实现:

with t1 AS

(SELECT

customer_id,

SUM(amount) AS amount

FROM

t

WHERE created_day BETWEEN '2020-06-01'

AND '2020-06-30'

GROUP BY customer_id),

t12 AS

(SELECT

t1.customer_id,

t1.amount,

IF(tmp.amount > 0, 1, 0) AS keep_state

FROM

t1

LEFT JOIN

(SELECT

customer_id,

SUM(amount) AS amount

FROM

t

WHERE created_day BETWEEN '2020-07-01'

AND '2020-07-31'

GROUP BY customer_id) tmp

ON tmp.customer_id = t1.customer_id),

t2 AS

(SELECT

CASE

WHEN amount >= 30000

THEN 1

WHEN amount >= 10000

THEN 2

ELSE 3

END AS customer_level,

COUNT(*) AS customter_cnt,

SUM(keep_state) AS keep_cnt

FROM

t12

GROUP BY customer_level)

SELECT

CASE

customer_level

WHEN 1

THEN '头部客户'

WHEN 2

THEN '腰部客户'

ELSE '尾部客户'

END AS '层级',

customter_cnt AS '客户数量',

keep_cnt AS '留存数量'

FROM

t2

ORDER BY customer_level

感兴趣的朋友可以尝试不使用左连接或者标量子查询的写法,而是只查一次 t 表就能实现需求。

本文分享自微信公众号 - SQL实现(gh_684ee9235a26)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

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

相关文章

python socket udp_python网络-Socket之udp编程(24)

一、udp简介udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。udp在传输数据报前不用在客户和服务器之间建立一个连接&…

selenium--单选下拉列表

下拉选择 from selenium import webdriver from time import sleepdriver webdriver.Chrome() driver.get("https://www.xxxxx.com/") sleep(2) driver.find_elements_by_tag_name(option)[2].click() # 通过标签名定位到 option 标签,选择第三个&#x…

matlab实现字符识别,字符识别 - MATLAB Simulink Example - MathWorks 中国

定义问题脚本 prprob 定义了一个包含 26 列的矩阵 X,每列对应一个字母。每列有 35 个值,值可能是 1,也可能是 0。每列(包含 35 个值)定义一个字母的 57 位图。矩阵 T 是一个 2626 的单位矩阵,它将 26 个输入向量映射到 26 个类。[…

python建立ip代理池_Python搭建代理IP池实现存储IP的方法

上一文写了如何从代理服务网站提取 IP,本文就讲解如何存储 IP,毕竟代理池还是要有一定量的 IP 数量才行。存储的方式有很多,直接一点的可以放在一个文本文件中,但操作起来不太灵活,而我选择的是 MySQL 数据库&#xff…

低秩矩阵分解 matlab,低秩分解的matlab代码看不懂,分解的两个矩阵在哪呀??...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼有四个文件:demo.mfunction [] demo()%This routine demonstrates an example of using LRR to do subspace segmentation. We cosntruct 5 independent subspaces, each of which has a rank of 10,%sample 200 point…

python深度神经网络算法_02.深度神经网络算法之Python基础与数据分析

资源内容:02.深度神经网络算法之Python基础与数据分析|____2016最新python基础篇视频教程22课|____Python学习手册(第4版).pdf|____Python程序入门与进阶|____基础篇01-福利课python先入为主上篇|____基础篇02-福利课python先入为主下篇|____基础篇03-虚拟机安装xub…

我们为什么要用MVC?ASP.NET MVC模式的优点?

1.关注点分离:每个功能最少会被切分为M-V-C三个部分,让开发者一次只需要关注一个部分,进而降低复杂难度,提高开发效率2.分层负责:明确切割,M-V-C三个部分并行开发3.自由操控HTML:在ASP.Net MVC中…

python 英语词频统计软件_Python实现统计英文文章词频的方法分析

本文实例讲述了Python实现统计英文文章词频的方法。分享给大家供大家参考,具体如下:应用介绍:统计英文文章词频是很常见的需求,本文利用python实现。思路分析:1、把英文文章的每个单词放到列表里,并统计列表…

mysql磁盘无法挂载,linux – 无法挂载磁盘(VFS:找不到ext4文件系统)

试图挂载磁盘(硬件raid)但失败了.#mount -t ext4 /dev/sda /datamount: wrong fs type,bad option,bad superblock on /dev/sda,missing codepage or helper program,or other errorIn some cases useful info is found in syslog - trydmesg | tail or so#dmesg | tail -1EXT4…

程序中的内存分配

栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈 1. 函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。 2. 栈的内存地址生长方向与堆相反,由…

python传中文参数_解决Python传递中文参数的问题

今天有个需要需要传递中文参数给URL但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误。烦的很。所以我们果断选择用urlencode来处理中文,由于国内外网站编码不同,国内是GBK的,国外是UTF8的。>>> import sys>>&…

数据结构php语言,PHP语言做网页开发,会用到什么数据结构,算法?

回复讨论(解决方案)这个要根据项目而定的,PHP做开发,首先得会html javascript不是 会用到什么数据结构,算法而是你将 什么数据结构,算法 用到网页开发中去这个要根据项目而定的,PHP做开发,首先得会html jav…

pythonpptx 楷体_python-pptx 实践 4:添加形状、文本

1、添加流程箭头#加载库importosfrom pptx importPresentationfrom pptx.util importInches, Ptfrom pptx.enum.text importPP_ALIGNfrom pptx.enum.shapes importMSO_SHAPEfrom pptx.dml.color importRGBColor#设置路径work_path rE:\pyspace\tmp\pptxos.chdir(work_path)#实…

C# DevExpress XtraMessageBox自定义字体,字体大小,自定义按钮大小,自定义Icon

1.使用XtraMessageBoxForm,自定义Icon 2.重写XtraMessageBoxForm,自定义消息字体,标题字体 3.注册XtraMessageBoxForm的Showing事件,自定义按钮字体及按钮大小 具体代码如下,只写了简单两种方法,可自己扩展…

php维护页面,php – Symfony2中的“维护网站”页面

我跟着这个tutorial.这非常简单直接.这是我所需要的.您只需更改参数然后清除prod缓存,您仍然可以在dev或测试环境中访问该应用程序.在你的parameters.yml中添加:parameters:maintenance: false #turn it to true to enable maintenanceunderMaintenanceUntil: tomor…

批处理结束某个进程_进程调度

当计算机系统是多道程序设计系统时,常常会出现多个进程或线程竞争CPU的情况。如果有大于处理器数的进程(线程)处于就绪态时,就必须要选择下一个要执行的进程(线程)。在操作系统,用于选择接下来要执行的进程的程序称之为调度程序(Scheduler)&a…

[RN] 可播放视频的播放器版本

可播放视频的播放器版本 "react": "16.6.3", "react-native": "0.57.8", "react-native-orientation": "^3.1.0", "react-native-vector-icons": "^4.3.0", "react-native-video":…

有限元python编程流行吗_Python进行有限元分析

本博客主要是来讲述采用Python语言,利用直接刚度法,来编写求解《有限元方法基础教程》(第五版) 的例题2.1。(也许有的人认为商业软件已经和普及了,没有 必要再自己进行编程了,但是龙猪在这里建议大家还是去了解一下有限元的原理&a…

java用中根后根序列构造二叉树,106. 从中序与后序遍历序列构造二叉树

题目描述根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。示例:例如,给出中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3]返回如下的二叉树:3/ \9 20/ \15 7思路1.思路与105. 从前序与中序…

Python_selenium之获取当前页面的href属性,id属性,图片信息和截全屏

一、 获取当前页面的全部信息 1. 图片信息包括图片名称、图片大小等信息 2. 只需将图片信息打印出来(image.text image.size image.tag_name) 二、 获取页面元素的href属性(id同理) 1. 获取当前页面所有的链接信息&#xff0…