用于RFM分析的MySQL查询

用于RFM分析的MySQL查询,mysql,case,Mysql,Case,我有一个包含RFM分析的用户/订单数据的表。 样本: 我试图写一个查询,将选择和分组的用户和金额,他们花费和分类的RFM。到目前为止,我已经: SELECT user_id, id_o, price, CASE WHEN price < 100 THEN '3' WHEN price >= 100 AND price < 500 THEN '2' ELSE '3' END AS M, CASE WHEN TIMESTAMPDIFF(DAY, o_date,

我有一个包含RFM分析的用户/订单数据的表。 样本:

我试图写一个查询,将选择和分组的用户和金额,他们花费和分类的RFM。到目前为止,我已经:

SELECT user_id, id_o, price,
CASE WHEN price < 100 THEN '3'
     WHEN price >= 100 AND price < 500 THEN '2'
     ELSE '3'
END AS M,

CASE WHEN TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) < 30 THEN '1'
     WHEN TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) >= 30 AND
          TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) < 60 THEN '2'
     ELSE '3'
END AS R

FROM orders;
选择用户id、id、价格、,
如果价格<100,则为“3”
当价格>=100且价格<500时,则为“2”
其他'3'
以M结尾,
时间差(日期,o_日期,日期('2019-01-01'))小于30,则为'1'
当时间差(日期,o_日期,日期('2019-01-01')>=30和
时间差(天,o_日期,日期('2019-01-01'))<60然后是'2'
其他'3'
以R结尾
从命令;
此查询提供了一个表,其中包含每个订单、在订单上花费的金额以及标记的R和M维度。但是,我还需要添加F维度,它可以作为每个用户的订单数量来完成。我尝试将另一个CASE语句添加到查询中,并按用户id进行分组,因此如下所示:

SELECT user_id, SUM(price),
CASE WHEN price < 100 THEN '3'
     WHEN price >= 100 AND price < 500 THEN '2'
     ELSE '3'
END AS M,

CASE WHEN TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) < 30 THEN '1'
     WHEN TIMESTAMPDIFF(DAY, o_date, DATE('2018-01-01')) >= 30 AND
          TIMESTAMPDIFF(DAY, o_date, DATE('2018-01-01')) < 60 THEN '2'
     ELSE '3'
END AS R,

CASE WHEN COUNT(id_o) > 20 THEN '1'
     WHEN COUNT(id_o) > 10 AND COUNT(id_o) <= 20 THEN '2'
     ELSE '3'
END AS F

FROM orders GROUP BY user_id;
选择用户标识、金额(价格),
如果价格<100,则为“3”
当价格>=100且价格<500时,则为“2”
其他'3'
以M结尾,
时间差(日期,o_日期,日期('2019-01-01'))小于30,则为'1'
时间差(日期,o_日期,日期('2018-01-01')>)大于等于30时,以及
时间差(天,o_日期,日期('2018-01-01'))<60然后是'2'
其他'3'
以R结尾,
当计数(id_o)>20时,则为“1”

当COUNT(id_o)>10和COUNT(id_o)时,我将现有的工作查询转换为嵌套查询,并将附加的CASE语句放在上面,并添加了一个GROUPBY子句。这让我:

SELECT user_id, SUM(price) AS 'Total Sum', R, M, COUNT(Orders.id_o),
  CASE WHEN COUNT(Orders.id_o) < 2 THEN "3"
       WHEN COUNT(Orders.id_o) >=2 AND COUNT(id_o) <4 THEN "2"
       ELSE "1" 
  END AS F
FROM 
(SELECT user_id, id_o, price,
CASE WHEN price < 100 THEN '3'
     WHEN price >= 100 AND price < 500 THEN '2'
     ELSE '3'
END AS M,

CASE WHEN TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) < 30 THEN '1'
     WHEN TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) >= 30 AND
          TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) < 60 THEN '2'
     ELSE '3'
END AS R

FROM orders) AS Orders
GROUP BY user_id;
希望这对其他人也有用

SELECT user_id, SUM(price) AS 'Total Sum', R, M, COUNT(Orders.id_o),
  CASE WHEN COUNT(Orders.id_o) < 2 THEN "3"
       WHEN COUNT(Orders.id_o) >=2 AND COUNT(id_o) <4 THEN "2"
       ELSE "1" 
  END AS F
FROM 
(SELECT user_id, id_o, price,
CASE WHEN price < 100 THEN '3'
     WHEN price >= 100 AND price < 500 THEN '2'
     ELSE '3'
END AS M,

CASE WHEN TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) < 30 THEN '1'
     WHEN TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) >= 30 AND
          TIMESTAMPDIFF(DAY, o_date, DATE('2019-01-01')) < 60 THEN '2'
     ELSE '3'
END AS R

FROM orders) AS Orders
GROUP BY user_id;
+---------+-----------+------+---+--------------------+---+
| user_id | Total Sum | R    | M | COUNT(Orders.id_o) | F |
+---------+-----------+------+---+--------------------+---+
|       0 |    400.00 | 3    | 2 |                  1 | 3 |
|       1 |     90.00 | 3    | 3 |                  2 | 2 |
|      76 |     80.00 | 3    | 3 |                  2 | 2 |
+---------+-----------+------+---+--------------------+---+