问题描述

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

要求:

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

输出结果的格式:

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

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

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

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

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

解决方案

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

下面我将用 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,这种语法在 MySQL 上能编译通过,在其它数据库中则不行。

第三步,计算留存。根据留存的定义,只要客户在本月中有消耗,就计入留存数。比如客户 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 表就能实现需求。

mysql统计用户留存_SQL 统计用户留存相关推荐

  1. mysql 两字段相乘_sql统计2列相乘和语句.doc

    sql统计2列相乘和语句 sql统计2列相乘和语句 篇一:sql统计2列相乘和语句 最近有网友提出"两数相除求余数 SQL语句怎么实现两列内容"等问题,小小知识站提取了各大知名网站 ...

  2. mysql本周 下周下月_sql 统计本周,本月,下周,下月sql语句

    //本款sql 语句可以查询,本周,本月,下周,下月生日的相关数据 sql 统计本周,本月,下周,下月sql语句 /* 表结构 Student(S#,Sname,Sage,Ssex) --S# 学生编 ...

  3. 统计每天的新老用户,日活,周活,月活

    版权声明:转载请注明出处! https://blog.csdn.net/ddxygq/article/details/81391718 最近有一个需求,统计每天的新老用户,日活,周活,月活. 我们每天 ...

  4. redis实现用户签到,统计活跃用户,用户在线状态,用户留存率

    开发的过程中,可能会遇到用户签到.统计当天的活跃用户.以及每个用户的在线状态,用户留存率的开发需求,可能会用传统的方法,根据相应的需求设计数据库表等,但这样耗费的存储空间大,以及性能方面也不会太好,下 ...

  5. 基于多模型融合的用户画像分析统计方法研究

    摘  要 随着信息技术的快速发展和大数据技术的广泛应用,企业的营销和产品的设计,对精细化.精准化的要求越来越高.主流的电商平台.搜索引擎以及短视频平台均推出了基于用户画像的个性化推荐服务,这其中相当一 ...

  6. CSDN是怎么实现用户签到,统计签到次数,连续签到天数等功能微服务的

    文章目录 需求分析 设计思路 用户签到和统计连续签到的次数 签到控制层 SignController 签到业务逻辑层 SignService 测试 按月统计用户签到的次数 签到控制层 SignCont ...

  7. 企业微信怎么分享名片给用户?如何统计名片添加好友的效果?

    企业微信本身有客户运营功能,能够帮助员工更便捷地沟通客户,服务客户.在运营客户前,我们需要在企业微信上添加客户,方法之一就是使用企业名片,让客户扫码进行添加.那么企业微信名片怎么分享给用户?如何统计名 ...

  8. 《用户思维 众创时代下的用户获取.体验.转化与留存》读书笔记

    一.读书感悟 全书通篇论述九种形式的订购制的商业模式,包括其优点,九种订购制的具体内容等,在今天的互联网中均可找到对应的例子.其中涉及经济效益和用户体验的平衡.用户如何获取.转化与留存. 决胜90天新 ...

  9. Redis实战 - 09 Redis BitMaps 实现用户签到,统计签到次数,统计签到情况等功能

    文章目录 1. 需求分析 2. 设计思路 3. 用户签到和统计连续签到的次数 1. 签到控制层 SignController 2. 签到业务逻辑层 SignService 3. 测试 4. 按月统计用 ...

最新文章

  1. torch.nn.functional.cross_entropy.ignore_index
  2. SAP QM 将业务上的偏差管理集成进入SAP系统?
  3. 20个开源项目助你快速掌握区块链应用开发,JS Go PHP Python Ruby
  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(39)-在线人数统计探讨
  5. JZOJ 5701. 【gdoi2018 day2】第一题 谈笑风生(magic)
  6. BZOJ2299 [HAOI2011]向量 【裴蜀定理】
  7. 用python控制钉钉软件_Python—实现钉钉后台开发
  8. rxtx串口事件不触发_STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
  9. TensorFlow 学习(七) — 常用函数 api、tf.nn、tf.keras
  10. Linux /boot分区空间不足
  11. vue-router页面传值及接收值
  12. 会计信息系统复习资料
  13. CH343串口驱动(包含各系统平台)
  14. JavaScript——操作表单(MD5验证)
  15. python 创建netcdf_如何用python netCDF4创建netCDF文件?
  16. 利用Python实现阴阳师自动抽卡
  17. [紧急]华展云再次连夜更新200余本16年会刊,2016年会刊量级已达全网第一
  18. Day04 利用flex布局完成PC端网页设计CSS+html部分
  19. Windows PowerShell简介
  20. 1471_TC275的内核种类以及ID判断

热门文章

  1. android app锁屏后定位,如何能让app在锁屏后还继续发送定位请求继续运行程序
  2. CAS:385437-57-0,DSPE-PEG-Biotin,磷脂-聚乙二醇-生物素用于生物分子的检测
  3. 离散系统频响特性函数freqz()
  4. Docker下运行两个ClickHouse容器后 ReplicatedMergeTree引擎借助Zookeeper将数据无法同步的解决方案,提示错误为“DNS_ERROR”
  5. IC卡读卡器卡号输出格式
  6. android编程绘制扇形,分析实现Android自定义View之扇形图
  7. cpu性能指标和测试工具
  8. 计算机学院毕业设计文化衫,超全毕业文化衫创意设计图案与素材整理!2017毕业班服设计图案!...
  9. MWC 2018火热开幕,AI取代手机成主角,华为超越苹果称霸!
  10. arduino蜂鸣器控制