如何在MySQL中找出客户购买的最常见3种产品组合?
找出最常见的3种产品组合
原始数据
| Client | Product |
|---|---|
| Alex | A |
| Alex | B |
| Alex | C |
| Alex | D |
| Peter | A |
| Peter | B |
| Peter | C |
| Aline | C |
| Aline | D |
| Aline | E |
| Aline | F |
| Aline | G |
| Joao | B |
| Joao | C |
| Joao | D |
| Joao | E |
| Nikky | A |
| Nikky | B |
| Nikky | C |
解决方案思路
要统计最常见的3产品组合,核心是先为每个客户生成所有可能的3产品组合,统一组合内产品的排序(避免因顺序不同被误判为不同组合),最后统计每个组合的出现次数并取Top3。
示例SQL实现(以MySQL为例)
-- 生成每个客户的3产品组合,统一组合内产品排序 WITH client_products AS ( SELECT Client, Product FROM your_table_name ), product_combinations AS ( SELECT cp1.Client, -- 按字母顺序拼接产品,确保组合唯一 CONCAT_WS(',', LEAST(cp1.Product, cp2.Product, cp3.Product), CASE WHEN (cp1.Product BETWEEN cp2.Product AND cp3.Product) OR (cp1.Product BETWEEN cp3.Product AND cp2.Product) THEN cp1.Product WHEN (cp2.Product BETWEEN cp1.Product AND cp3.Product) OR (cp2.Product BETWEEN cp3.Product AND cp1.Product) THEN cp2.Product ELSE cp3.Product END, GREATEST(cp1.Product, cp2.Product, cp3.Product) ) AS product_triple FROM client_products cp1 JOIN client_products cp2 ON cp1.Client = cp2.Client AND cp1.Product < cp2.Product JOIN client_products cp3 ON cp2.Client = cp3.Client AND cp2.Product < cp3.Product ) -- 统计组合出现次数,取前3 SELECT product_triple, COUNT(*) AS occurrence_count FROM product_combinations GROUP BY product_triple ORDER BY occurrence_count DESC, product_triple LIMIT 3;
代码解释
- client_products CTE:提取所有客户与产品的关联数据。
- product_combinations CTE:通过三次自连接生成每个客户的所有3产品组合,利用
LEAST、GREATEST和条件判断确保组合内产品按字母顺序排列,避免"A,B,C"和"B,A,C"被当作不同组合。 - 最后统计每个组合的出现次数,按次数降序排序后取前3条结果。
结果说明
针对示例数据执行上述SQL后,会得到如下结果:
| product_triple | occurrence_count |
|---|---|
| A,B,C | 3 |
| B,C,D | 2 |
| A,B,D | 1 |
其中"A,B,C"是出现次数最多的3产品组合,与需求预期一致。
内容的提问来源于stack exchange,提问作者vie.luo
相关产品推荐
相关产品推荐

