所需数据:ORDER_INFO_UTF.CSV、USER_INFO_UTF.CSV

提取码:yu63

我的数据库版本是Mysql 8.0

本文章参考 秦路老师七周成为数据分析师 的视频,和视频中讲解的这部分内容有少许差异。

这篇文章的目的是练习 怎么导入数据 以及 学习实际业务中的SQL逻辑,写出可以复用的SQL语句,不对数据做过多的清洗。

目录:

一、将数据导入数据库

1.建表

2.导入数据

二、理解数据

1.表字段及含义

2.表信息中的业务问题

三、数据清洗

四、SQL--用户消费行为分析

1-统计不同月份的下单人数

2-统计用户不同月份的回购率和复购率

3-统计不同性别的消费频次是否有差异

4-统计多次消费的用户,第一次和最后一次消费时间的间隔

5-统计不同年龄段的用户消费金额是否有差异

6-统计不同性别的用户消费金额是否有差异

7-统计消费的二八法则,消费的top20%用户,贡献了多少额度

一、将数据导入数据库

目的:将两份csv文件导入数据库

步骤:建表、导入数据

1.建表.数据库data建表orderinfo

2.导入数据

前面给出的数据较大,分别是10万和50万条数据,如果用数据库自带的导数工具比较缓慢,这里介绍用cmd命令行方式导入。导入USER_INFO_UTF.CSV秦路老师导这两个文件的方法以及对表字段类型的定义,在我这里一直报错(秦路老师讲解这部分的视频地址:

二、理解数据

1.表字段及含义用户明细表:userinfo

userinfo 客户信息表 userId 用户id

sex 性别 birth 出生年月日订单明细表:orderinfo

orderinfo 订单信息表 orderId 订单id userId 客户id isPaid 是否支付 price 商品价格 paidTime 支付时间

两个表是通过 userid 进行联结的。

2.表信息中的业务问题用户明细表 userinfo 可以分析用户画像

订单明细表 orderinfo 可以分析用户不同月份回购率和复购率

订单明细表 orderinfo 可以分析不同支付方式占比

两表联结,分析不同性别、年龄段的用户消费频次和消费金额差异

俩表联结,粗略统计用户生命周期

三、数据清洗

userinfo 中的 birth 和 orderinfo 中的 paidtime 是varchar类型,应该转为日期格式。paidtime字段处理

首先将 paidtime 中的 / 替换为 -,这里用到 replace 函数:birth字段处理

首先将 birth 中的 / 替换成 - ,这里用到 replace 函数:

我用上述 paidtime 处理方式时,会报错,显示部分 birth 数据是有时分秒的,显然时分秒在这里是用不到的,我们只取出年月日即可,这里用 left 函数来处理:

当然还有很多空数据,还有异常的消费数据,在这里不做处理了。

四、SQL--用户消费行为分析

这里我们分析以下几个问题:

1-统计不同月份的下单人数

2-统计用户不同月份的回购率和复购率

3-统计不同性别的消费频次是否有差异

4-统计多次消费的用户,第一次和最后一次消费时间的间隔

5-统计不同年龄段的用户消费金额是否有差异

6-统计不同性别的用户消费金额是否有差异

7-统计消费的二八法则,消费的top20%用户,贡献了多少额度

1-统计不同月份的下单人数

分析:每个月---应该按照 月份 分组,但是数据里面有不同年份的数据,所以这里应该是按照 年、月 分组;下单人数---对 用户id 计数 count ;下面的语句还用到 concat ,这是为了将数据写成 年-月 形式。

2-统计用户不同月份的回购率和复购率

这里明确 复购率 和 回购率 的概念复购:某个时间段内 购买次数>1次 的用户

回购:某个时间段内 用户 有购买行为,过段时间后,用户 又购买,这叫做回购。回购和复购的差别是,跨了两个时间维度。

例如三月份一共有1000名用户购买,其中10个用户在三月份购买次数超过1次,那么复购率是10/1000;三月份购买的人中有100个人在4月份又购买,那么回购率是100/1000。

(1)复购率

增加一列月度数据

这里面的所有购买都是至少一次,因为我们是从月份去选取,如果为0就不会出现这个值了,所以不需要过滤。

再通过这个子查询,用条件if来选出符合条件的个数,如果不符合就是null,就不会记录到count里面,同时将其除以当月的总数(这步有可能想不到用null,那么可以用sum,然后不符合就是0也可以的)。回购率

这里介绍两种方法。

方法1

首先,添加一列 月数据

我们要筛选的是什么样的数据?

我们希望筛选出来的是当月有购买,下个月还购买的,从上图的数据发现,我们希望筛选出来的是ordermonth1 比 ordermonth 大1个月份 的 数据。

这里如果只想得到回购人数的话,其实用on和where筛选都可以的,但是如果还想得到当月购买总人数,那么就不要用where来筛选,因为where会把不符合的这个 月份差规则 的数据过滤掉。

这里我们用on来关联,关联条件是 t1.ordermonth=date_sub(t2.ordermonth,interval 1 month)

从上图中我们可以看出 orderid1 和 ordermonth1 不是null的就是回购的,那么我们就可以对 月份分组 然后对 orderid1 即 t2.userid 求count,就应该是回购人数;对 userid 也就是 t1.userid 来求 count 就应该是当月购买总人数。

回购率就是用 回购人数/当月购买人数:

方法2

俩表联结之前方法都一样。如果这里我们用内连接,其实和 left 联结 结果一样,只是后面我们筛选 月份规则 的时候不采用on联结的方式。我们先看内联结结果是不是和 left 联结一样。

下面我仿照之前求复购率的方式,用 count if 来筛选出 符合月份规则 的数据。

3-统计不同性别的消费频次是否有差异

两个表内连接,然后按照userid 和 sex 分组,求出每个 userid 的消费次数,在求出平均消费次数

从上图可以看出有性别为空的数据,所以这里我们筛选出性别不为空的数据,可以在join之前的userinfo筛选,也可以在join之后的大表筛选,这里为了方便我在大表筛选。

4-统计多次消费的用户,第一次和最后一次消费时间的间隔

分析:按照用户id分组,现将每个用户第一次和最后一次消费的时间 select,这里还要注意一个having筛选条件,用户购买次数一定要>1,然后当做子查询的临时表,从这个临时表中再求出时间间隔。

这里第一次消费和最后一次消费时间也就是min和max时间。

原日期是年-月-日-时-分-秒的形式,用datediff求差时得到的是差多少秒,所以这里将日期写成年-月-日的形式。

5-统计不同年龄段的用户消费金额是否有差异

将两个表联结,然后select price和年龄段,年龄段是用用case when 划分的,筛选条件是已支付订单的金额,将这个表当做一个临时表,临时表对年龄段分组,然后求出平均金额。

年龄是用的现在的年份-出生的年份求出来的;

平均金额 用round 保留两位小数。

6-统计不同性别的用户消费金额是否有差异

分析方法和第5个问题类似。

7-统计消费的二八法则,消费的top20%用户,贡献了多少额度

分析:从已支付用户中筛选,对用户id进行分组,对 每个用户的 price求和,然后用窗口函数对sum price 排序,查询出来的结果当做临时表,从临时表中筛选排名top20%的用户,对这部分用户的 金额求和。

窗口函数是可以对分组的结果进行排序,很方便。

窗口函数 可以参考我之前的一篇文章:Foina:SQL高级功能--窗口函数及面试题TOPN和组内比较问题​zhuanlan.zhihu.com

mysql求回购率_SQL-- 用户行为(复购率、回购率等)相关推荐

  1. hive练习题(二)计算用户的复购率和回购率

    hive练习题(二)计算用户的复购率和回购率 数据表ods_sales_orders前10行 复购率 定义:在某时间窗口内重复消费用户(消费两次及以上的用户)在总消费用户中占比 例如,按月作为统计窗口 ...

  2. MySQL中用户订单复购率的计算

    1.项目需求(计算复购率) 订单表中有用户ID.订单金额.每笔订单的下单时间等信息,需要统计每个月在接下来几个月用户复购情况 // 创建数据表 create table orders( order_i ...

  3. 复购率/回购率/新购人数

    1. 回购率 #回购率第一步 select date_month,userid from orderr group by date_month,userid order by date_month 这 ...

  4. mysql复购率_MySQL_复购回购率

    指标解释 如何计算复购率/回购率 计算方法一:复购的人 复购率 = 单位时间内购买次数大于1的人/所有购买的人 例如: 一段时间内,10个人中有3个人购买2次,这3个人中有一个人又购买了一次,累计复购 ...

  5. MySQL 留存率和复购率的场景分析

    实际工作中常见的业务场景是求次日留存率,还有一些会对次日留存率增加限制,例如求新用户的次日留存率或者求活跃用户留存率.另外,留存率和复购率看起来都是统计重复出现的概率,但实际求解方法是不一样的. [场 ...

  6. 哪个是更早的时间 date_淘宝用户行为分析(漏斗模型+pv,uv,pv/uv,复购率,用户活跃时间段)...

    数据来源https://tianchi.aliyun.com/dataset/dataDetail?dataId=46 用户行为表:用户ID,商品ID,用户行为.用户地点,商品大类ID,时间 需求:该 ...

  7. mysql求回购率_用户行为分析——回购率、复购率(SQL、Python求解)

    有一个多月没有用Python了,有些生疏o(╥﹏╥)o.通过秦路老师的一道题目,分别使用sql和python求解,顺便复习下python点,重点关注[复购率].[回购率]的解法 ☞秦路老师视频讲解(使 ...

  8. mysql复购率_Mysql与Pyhton实现复购率和回购率

    一.复购率 复购率:一段时间内,购买2次及以上客户人数,占该时间段内购买过的总人数的比重. 例如:一个月以内,购买该商品超过两次的人有50个人,一个月内买过该商品的人有100个人,该月内复购率就是50 ...

  9. 如何用sql计算回购率、复购率指标

    这6道sql题都很好,建议都过一遍: 考察知识点: 回购率.复购率的理解 子查询 inner join 重点推荐第2题,第5题,第6题 理解需求.理解题意 (★★★★★) datediff ceil ...

最新文章

  1. shell基础语法以及监控进程不存在重启
  2. 吊打一切:YOLOv4的tricks汇总
  3. Solr Schema.xml分析
  4. COCOS2D创建菜单,按钮区域和文字显示不一致
  5. Universal Windows Platform(UWP)应用的窗口特性
  6. IntelliJ IDEA for Mac自定义动态代码模板快捷键(Live Templates Shortcut)
  7. matlibplot 一张图画多个曲线_热重法实验条件设定与曲线解析 第53部分 热重实验方案设计与曲线解析常见问题之热重仪选择中常见问题分析...
  8. [源码和文档分享]基于AVL树表示的集合ADT实现与应用
  9. 6-6 求二叉树高度 (15 分)
  10. 用html+css+js实现一个无限级树形控件
  11. php pdo fetchassoc,pdo执行fetch查询语句,出现500错误,请问应该怎么写
  12. 再学 GDI+[86]: TGPImage(6) - 拖动图像
  13. Visual Studio 2010 中编写C代码的一些常见问题
  14. 高频头极化角调整+用什么本振的高频头
  15. 副驾驶的意义_副驾驶位置有什么含义?
  16. Oracle官网下载11g历史版本
  17. php:获取字符串的长度
  18. C++常用函数(刷PAT甲级总结)
  19. 前端CSS移动端适配
  20. (2022年12月最新)SpringBoot远程代码执行whitelabel error page SpEL RCE漏洞复现

热门文章

  1. java 7编程高级进阶_Java7编程高级进阶-积累(1)
  2. Java实现批量修改文件名
  3. 基于《狂神说Java》Redis--学习笔记
  4. 打印机 打印机驱动 打印机如何与PC通信 什么通信协议 蓝牙打印机项目 蓝牙协议栈
  5. 如何利用英特尔管理工具绕过Windows防火墙
  6. 清华女硕士代言西湖名胜六和塔(组图),张姣怡,杭州西湖六和塔
  7. windows 2003找不到Dirext X的解决办法
  8. 打开 mhtml 文件 显示不全_解决 Nginx autoindex 显示文件名不全的问题
  9. PHP 项目 该网页无法正常运作情况,但没有报错
  10. Gradle 4.4 版本 百度云网盘地址(永久有效)