需求:
RFM模型介绍:
RFM模型是客户关系管理领域里的一种消费行为分析模型,用来衡量用户的内在价值和忠诚度。它从三个关键维度描述用户的购买行为,
其中R近度(Recency)代表最近购买时间,指上次购买距离当前的时间间隔;
F频度(Frequency)代表购买频率,指某一段时间内购买的次数;
M额度(Monetary)代表总购买金额,指某一段时间内购买商品的金额。
经过研究发现:
- R值越小,用户越有可能产生新的交易。
- F值越大,用户越有可能产生新的交易。
- M值越大,用户越有可能产生新的交易。
根据RFM模型,可以将付费用户细分为8种类型:
高 高 高 重要价值客户
高 低 高 重要发展客户
低 高 高 重要保持客户
低 低 高 重要挽留客户
高 高 低 一般价值客户
高 低 低 一般发展客户
低 高 低 一般保持客户
低 低 低 一般挽留客户
sql重要指标示意:
R:某一段时间内个人从当前时间距最近一次消费时间间隔
F:某一段时间内个人消费频率
M:某一段时间内个人消费总金额
R1:某一段时间内所有客户从当前时间距最近一次消费时间间隔平均数
F1:某一段时间内所有客户消费频率平均数
M1:某一段时间内所有客户消费总金额平均数
具体sql:
SELECT u1.user_id
,CASE
WHEN u1.R >= u2.R1
AND u1.F >= u2.F1
AND u1.M >= u2.M1
THEN '重要价值客户'
WHEN u1.R >= u2.R1
AND u1.F < u2.F1
AND u1.M >= u2.M1
THEN '重要发展客户'
WHEN u1.R < u2.R1
AND u1.F >= u2.F1
AND u1.M >= u2.M1
THEN '重要保持客户'
WHEN u1.R < u2.R1
AND u1.F < u2.F1
AND u1.M >= u2.M1
THEN '重要挽留客户'
WHEN u1.R >= u2.R1
AND u1.F >= u2.F1
AND u1.M < u2.M1
THEN '一般价值客户'
WHEN u1.R >= u2.R1
AND u1.F < u2.F1
AND u1.M < u2.M1
THEN '一般发展客户'
WHEN u1.R < u2.R1
AND u1.F >= u2.F1
AND u1.M < u2.M1
THEN '一般保持客户'
WHEN u1.R < u2.R1
AND u1.F < u2.F1
AND u1.M < u2.M1
THEN '一般挽留客户'
END
FROM (
SELECT user_id
,R /*每个人的R*/
,sum(pay) AS M /*每个人的M*/
,count(1) AS F /*每个人的F*/
FROM (SELECT a.*,
datediff(from_unixtime(unix_timestamp(), 'yyyy-MM-dd'), from_unixtime(cast(last AS INT), 'yyyy-MM-dd')) AS R /*计算得到的最近购买时间,与当前时间的间隔*/
FROM (
SELECT *
FROM (
SELECT user_id,
购买金额 as pay_num,
,row_number() OVER (
PARTITION BY user_id
,‘订单编号’ ORDER BY ‘下单时间’ DESC
) AS rank/*以顾客、订单号码分组,下单时间降序排列,对所有数据进行排名*/
,FIRST_VALUE(`下单时间`) OVER (
PARTITION BY user_id ORDER BY `下单时间` DESC
) AS last /*以顾客id分组,下单时间降序排列,获取每一位顾客最后的下单时间*/
FROM events
WHERE event=‘事件名称’
and
下单时间 BETWEEN '20211101'
AND '20211131'
) FM
WHERE FM.rank = 1 /*获取每位顾客最近一次下单*/
) a)q1
GROUP BY user_id,
) u1
JOIN (
SELECT t2.daysum / t1.ucount AS R1/*平均间隔天数*/
,t1.paycount / t1.ucount AS F1/*平均支付次数*/
,t1.paysum / t1.ucount AS M1/*平均支付金额*/
FROM
(
SELECT sum(pay_num) AS paysum/*总的消费金额*/
,sum(1) AS paycount/*总的消费次数*/
,count(DISTINCT user_id ) AS ucount/*总的客户*/
FROM (SELECT a.*,
datediff(from_unixtime(unix_timestamp(), 'yyyy-MM-dd'), from_unixtime(cast(last AS INT), 'yyyy-MM-dd')) AS R /*计算得到的最近购买时间,与当前时间的间隔*/
FROM (
SELECT *
FROM (
SELECT user_id,
购买金额 as pay_num,
,row_number() OVER (
PARTITION BY user_id
,‘订单编号’ ORDER BY ‘下单时间’ DESC
) AS rank/*以顾客、订单号码分组,下单时间降序排列,对所有数据进行排名*/
,FIRST_VALUE(`下单时间`) OVER (
PARTITION BY user_id ORDER BY `下单时间` DESC
) AS last /*以顾客id分组,下单时间降序排列,获取每一位顾客最后的下单时间*/
FROM events
WHERE event=‘事件名称’
and
下单时间 BETWEEN '20211101'
AND '20211131'
) FM
WHERE FM.rank = 1 /*获取每位顾客最近一次下单*/
) a)q1
) t1
JOIN
(
SELECT sum(R) AS daysum/*总的间隔天数*/
FROM
(
SELECT user_id
,R
FROM ( SELECT a.*,
datediff(from_unixtime(unix_timestamp(), 'yyyy-MM-dd'), from_unixtime(cast(last AS INT), 'yyyy-MM-dd')) AS R /*计算得到的最近购买时间,与当前时间的间隔*/
FROM (
SELECT *
FROM (
SELECT user_id,
购买金额 as pay_num,
,row_number() OVER (
PARTITION BY user_id
,‘订单编号’ ORDER BY ‘下单时间’ DESC
) AS rank/*以顾客、订单号码分组,下单时间降序排列,对所有数据进行排名*/
,FIRST_VALUE(`下单时间`) OVER (
PARTITION BY user_id ORDER BY `下单时间` DESC
) AS last /*以顾客id分组,下单时间降序排列,获取每一位顾客最后的下单时间*/
FROM events
WHERE event=‘事件名称’
and
下单时间 BETWEEN '20211101'
AND '20211131'
) FM
WHERE FM.rank = 1 /*获取每位顾客最近一次下单*/
) a)q1
GROUP BY user_id
,R
) t
) t2
) u2