sql 去重查询_手把手教你用 SQL 实现同期群分析

本文目录

  • 前言
  • 清洗数据:筛选订单状态为“交易成功”的行
  • 获取首单时间
  • 求月份偏移:求出月份差,并对首次付款时间降采样
  • 计算留存量:通过首次付款时间和月份差进行分组,求唯一的用户id数
  • 求留存率

前言

数据字段、同期群含义、数据概览等细节,请参照前面几篇文章:

Dima:手把手教你用 Python 实现同期群分析(1)​zhuanlan.zhihu.com
Dima:手把手教你用 Python 实现同期群分析(2)​zhuanlan.zhihu.com

本文我们依旧选择最经典,也是数分面试中最常考的留存率作为例子。

b4c50cd17e45360832fbdd78c3847af2.png
本文,采用第一种方法实现!

本文所涉及的完整实战数据和代码等,详见百度云网盘链接:

链接:https://pan.baidu.com/s/1_CTwkdzFbXNH9iZPoYm2bw

提取码:maz8

468c61bc6cba62e42256d3e1a4528d38.png
涉及的SQL脚本、SQL数据源

Ps:本文重代码工具实现,分析的思路及结论暂不涉及!

一、数据清洗

先筛选出 order_status 为“交易成功”的行,并筛选出 nick_namepay_time 两个字段。由于我们后续的查询都是基于筛选后的数据,因此这里新建一个表 sheet1 去存储查询结果。

8c6f8b26de4b53c5a9345c94e4fdc2c0.png

二、计算首单时间

nick_name 进行groupby,再求最小值即可。

7599c2182dd643572d25dba359b2a61f.png

三、计算月份差,重采样首次支付时间

此步骤,会涉及到两个重要的函数:

  • MySQL 对时间戳重采样用:YEAR()、MONTH()等函数;
  • 用于计算日期差的 TIMESTAMPDIFF,具体语法为:TIMESTAMPDIFF(频率,起始时间,结束时间)。
注意:在计算月份差之前,需要以用户名称作为依据,拼接用户的首单时间。但由于数据量较大,拼接需要重复遍历整个表很多遍,耗时很长。而当前查询的结果并不是最终结果,我们只需要确保查询语句没有问题即可。因此我们引入分页查询(LIMIT语句)来限制查询结果的行数,从而提高查询效率。

b87080df2bec91a9024917b17d1e7c19.png
注意SQL运行效率问题!

四、计算留存量

将前面的三个步骤汇总,作为子查询,并以“首次支付时间 f_time以及 “月份差 m_diff 作为条件对数据进行分组,用DISTINCT筛选出唯一的 nick_name 即可求出留存量。

这里创建一个名为 sheet2 的表储存查询结果。

4b9ce730bc68602b0779c6197faabc57.png

ff98932f457738024127411fb6b27144.png
sheet2 结果

五、计算留存率

为了实现最终结果,需要多层子查询,多层嵌套!

afe4fe50266745999e75ce5c9b098db3.png
最终结果

第一步,查询首付月份的用户量;

66ba2a2478a0ba625ed8a2b298e4c205.png
最内部的子查询

第二步,计算留存率;

287de9b7f10d96f180aea2e9264fb28e.png
二级子查询:计算留存率。

第三步,转置表格,将月份差作为列名;

af6817402e64a41db1f8587b43f137f8.png

3bc53e1da33d5e69bbf6e71a2e6866e3.png
一级子查询结果

最后一步,计算留存率!

根据上图查询结果,重点理解下面两行 SQL脚本 的妙处!

AVG(n.`留存量`) AS "本月新增",
CONCAT(SUM(n.`+1月`),"%") AS "+1月"

ab4feb2158e51e96c1d0a0158d06b725.png
最终实现留存计算的SQL语句

afe4fe50266745999e75ce5c9b098db3.png
最终留存率!

最后,总结一下,本文涉及到的重要知识点:

  • 时间重采样函数:YEAR、MONTH
  • 时间差函数:TIMESTAMPDIFF
  • 流程控制函数:CASE WHEN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值