按交易顺序组合购买

时间:2019-02-04 06:35:21

标签: mysql sql

我正在处理问题,并且无法生成决策表。

假设您得到一张人们的购买习惯表,我想生成的是一起购买的产品对的唯一组合,请考虑这个玩具示例来说明问题。


+-------+-----------------+---------+
| buyer | transaction seq | product |
+-------+-----------------+---------+
| 1     | 1               | milk    |
| 1     | 1               | butter  |
| 1     | 2               | milk    |
| 2     | 1               | butter  |
| 2     | 2               | milk    |
| 3     | 1               | butter  |
| 3     | 2               | spoon   |
+-------+-----------------+---------+

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

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

1. milk (tr1) & milk (tr2)
2. butter (tr1) & milk (tr2)

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

类似地,对于买方2,唯一可能的组合是(黄油和牛奶)

对于买方3,它是(黄油和汤匙)。

最后,我想计算这种独特组合的数量。在这种情况下,将会是

 
+---------------+-------+
| combination   | count |
+---------------+-------+
| milk; milk    | 1     |
| butter; milk  | 2     |
| butter; spoon | 1     |
+---------------+-------+

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

如果获得上表,如何在MySQL中执行此操作?有任何想法吗?

1 个答案:

答案 0 :(得分:1)

我认为您只想加入自我。

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;

我认为不需要将产品串联到一个列中。

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

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