复购率 mysql 实例
准备工作,可以去下载 classicmodels 数据库具体如下
点击:classicmodels
用的是 MySQL 8.0
前言
什么是复购率?,以下是百度百科查的结果
复购率有叫 重复购买率, 大家也可以去百度百科查 重复购买率的定义。
指消费者对该品牌产品或者服务的重复购买次数,重复购买率越多,则反应出消费者对品牌的忠诚度就越高,反之则越低。
重复购买率有两种计算方法:
一种是所有购买过产品的顾客,以每个人人为独立单位重复购买产品的次数,比如有10个客户购买了产品,5个产生了重复购买,则重复购买率为50%;
第二种,按交易计算,即重复购买交易次数与总交易次数的比值,如某月内,一共产生了100笔交易,其中有20个人有了二次购买,这20人中的10个人又有了三次购买,则重复购买次数为30次,重复购买率为30%。
推荐企业采取第一种算法。这里就介绍第一种
一、数据准备
select * FROM classicmodels.orders
二、复购率计算步骤
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
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(*)
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%
总结
很多行业对复购率还是比较看重的,是一个重要的指标 。比如互联网,比如医美,比如快消等。希望对大家有帮助,有不足之处也请指出。