0
点赞
收藏
分享

微信扫一扫

RFM计算SQL

闲鱼不咸_99f1 2022-04-29 阅读 87
sql

需求:

在这里插入图片描述

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
举报

相关推荐

0 条评论