首页 > 解决方案 > 按交易顺序组合购买

问题描述

我正在解决一个问题,我陷入了生成决策表的困境。

假设您有一张人们的购买习惯表,我试图生成的是一起购买的产品对的独特组合,考虑这个玩具示例来说明问题。

+--------+------+---------+
| 买家 | 交易序列 | 产品 |
+--------+------+---------+
| 1 | 1 | 牛奶|
| 1 | 1 | 黄油| 高分辨率照片| CLIPARTO
| 1 | 2 | 牛奶|
| 2 | 1 | 黄油| 高分辨率照片| CLIPARTO
| 2 | 2 | 牛奶|
| 3 | 1 | 黄油| 高分辨率照片| CLIPARTO
| 3 | 2 | 勺子| 高分辨率照片| CLIPARTO
+--------+------+---------+

您有买家 ID、该特定买家的交易顺序以及他购买的产品。所以第一行告诉我们买家 1 在他的第一笔交易中购买了牛奶和黄油,在他的第二笔交易中再次购买了牛奶。

因此,对于买方 1,所有可能的产品组合是 -

1. 牛奶 (tr1) & 牛奶 (tr2)
2. 黄油 (tr1) & 牛奶 (tr2)

因此,您可以将其视为所有可能组合的笛卡尔连接。

同样,对于买家 2,唯一可能的组合是(黄油和牛奶)

对于买家 3,它是(黄油和勺子)。

归根结底,我想计算这种独特组合的数量。在这种情况下,它将是,

 
+---------------+--------+
| 组合 | 计数 |
+---------------+--------+
| 牛奶; 牛奶| 1 |
| 牛油; 牛奶| 2 |
| 牛油; 勺子| 高分辨率照片| CLIPARTO 1 |
+---------------+--------+

请记住,我们需要确保订单不变,因此(黄油+牛奶)与(牛奶+黄油)不同,因为交易顺序很重要,因此应将它们单独计算为单独的组。

如果给我上表,我怎么能在 MySQL 中做到这一点?有任何想法吗?

标签: mysqlsql

解决方案


我想你只是想要一个自我加入。

select p.product as first_product,
       p2.product as second_product,
       count(distinct p.buyer) as num_buyers,
       count(*) as num_purchases
from purchases p join
     purchases p2
     on p2.buyer = p.buyer and
        p2.seq > p.seq
group by p.product, p2.product
order by num_buyers desc;

我认为不需要将产品连接到单个列中。

您的问题在一些细节上含糊不清:

  • 您是在计算买家还是购买量?
  • “下一次”购买是否必须在下一次交易或任何后续交易中进行?
  • 同一产品可以多次购买吗?

推荐阅读