复购率 mysql 实例(sample database classicmodels _No.1 )

47 阅读4分钟

复购率 mysql 实例

准备工作,可以去下载 classicmodels 数据库具体如下

准备工作

可以去下载 classicmodels 数据库资源如下

[ 点击:classicmodels官网下载]

[也可以去CSDN 去免费资源下载]

前言

什么是复购率?,以下是百度百科查的结果

复购率有叫 重复购买率, 大家也可以去百度百科查 重复购买率的定义。

指消费者对该品牌产品或者服务的重复购买次数,重复购买率越多,则反应出消费者对品牌的忠诚度就越高,反之则越低。 重复购买率有两种计算方法: 一种是所有购买过产品的顾客,以每个人人为独立单位重复购买产品的次数,比如有10个客户购买了产品,5个产生了重复购买,则重复购买率为50%;

第二种,按交易计算,即重复购买交易次数与总交易次数的比值,如某月内,一共产生了100笔交易,其中有20个人有了二次购买,这20人中的10个人又有了三次购买,则重复购买次数为30次,重复购买率为30%。

推荐企业采取第一种算法。这里就介绍第一种

一、数据准备

select * FROM  classicmodels.orders

image.png

二、复购率计算步骤

1.窗口函数计算首次购买日期

代码如下(示例):

SELECT customerNumber, -- 客户编号
DATE(orderDate)  as order_date, -- 购买日期
min(DATE(orderDate)) OVER (PARTITION BY customerNumber) AS first_orderdate  -- 首次购买日期
FROM  classicmodels.orders

2.第2次购买间隔天数,月份数

代码如下(示例),这个就可以看到date_diff不是0的都是复购的订单:

select DISTINCT customerNumber as'user_id' , -- 客户编号
order_date , -- 购买日期 
first_orderdate , -- 首次购买日期
DATEDIFF(order_date, first_orderdate) date_diff ,  -- 首购后,再次购买间隔天数 
(year(order_date)-year(first_orderdate))*12+ (month(order_date)-month(first_orderdate)) month_diff -- 首购后,再次购买间隔月份数
          from (
SELECT customerNumber, -- 客户编号
DATE(orderDate)  as order_date, -- 购买日期
min(DATE(orderDate)) OVER (PARTITION BY customerNumber) AS first_orderdate  -- 首次购买日期
FROM  classicmodels.orders
          ) a 

image.png

3.每个客户编号的复购次数

select user_id,count(user_id) from (

select DISTINCT customerNumber as'user_id' , -- 客户编号
 order_date , -- 购买日期 
first_orderdate , -- 首次购买日期
DATEDIFF(order_date, first_orderdate) date_diff ,  -- 首购后,再次购买间隔天数 
(year(order_date)-year(first_orderdate))*12+ (month(order_date)-month(first_orderdate)) month_diff -- 首购后,再次购买间隔月份数
from (
SELECT customerNumber, -- 客户编号
DATE(orderDate)  as order_date, -- 购买日期
min(DATE(orderDate)) OVER (PARTITION BY customerNumber) AS first_orderdate  -- 首次购买日期
FROM  classicmodels.orders
) a   where  DATEDIFF(order_date, first_orderdate)>0
) b group by user_id order by count(*)

image.png

4.复购次数汇总

说明下这里统计周期比较长是按照 2003-01-06~2005-05-31 时间统计
具体可以根据按时间统计
select 
count(if(复购次数=1,user_id,null)) as '复购次数1次客户人数',
count(if(复购次数=2,user_id,null)) as '复购次数2次客户人数',
count(if(复购次数=3,user_id,null)) as '复购次数3次客户人数',
count(if(复购次数=4,user_id,null)) as '复购次数4次客户人数',
count(if(复购次数>4,user_id,null)) as '复购次数大于4次客户人数'

from 
(
select user_id,count(user_id) as '复购次数' from (
          select DISTINCT customerNumber as'user_id' , -- 客户编号
          order_date , -- 购买日期 
          first_orderdate , -- 首次购买日期
           DATEDIFF(order_date, first_orderdate) date_diff ,  -- 首购后,再次购买间隔天数 
           (year(order_date)-year(first_orderdate))*12+ (month(order_date)-month(first_orderdate)) month_diff -- 首购后,再次购买间隔月份数
from (
SELECT customerNumber, -- 客户编号
DATE(orderDate)  as order_date, -- 购买日期
min(DATE(orderDate)) OVER (PARTITION BY customerNumber) AS first_orderdate  -- 首次购买日期
FROM  classicmodels.orders
          ) a   where  DATEDIFF(order_date, first_orderdate)!=0
          ) b
group by user_id 
) c

最后方便大家理解 select count(distinct customerNumber) FROM classicmodels.orders 有 98人 有复购行为的 有 97 人 . 有一个人在2003-01-06到2005-05-31 之间只买了一次没有复购 所以如果按这个时间段算(2003-01-06到2005-05-31 ) 复购率是 97/98=98%

总结

很多行业对复购率还是比较看重的,是一个重要的指标 。比如互联网,比如医美,比如快消等。希望对大家有帮助,有不足之处也请指出。