对订单详细信息进行市场购物篮分析

时间:2015-09-05 01:59:22

标签: sql market-basket-analysis

我有一个看起来像(缩写)的表:

| order_id  | item_id   | amount    | qty   | date          |
|---------- |---------  |--------   |-----  |------------   |
| 1         | 1         | 10        | 1     | 10-10-2014    |
| 1         | 2         | 20        | 2     | 10-10-2014    |
| 2         | 1         | 10        | 1     | 10-12-2014    |
| 2         | 2         | 20        | 1     | 10-12-2014    |
| 2         | 3         | 45        | 1     | 10-12-2014    |
| 3         | 1         | 10        | 1     | 9-9-2014      |
| 3         | 3         | 45        | 1     | 9-9-2014      |
| 4         | 2         | 20        | 1     | 11-11-2014    |

我想运行一个计算项目列表的查询 这种情况最常发生在一起。

在这种情况下,结果将是:

|items|frequency|
|-----|---------|
|1,2, |2        |
|1,3  |1        |
|2,3  |1        |
|2    |1        |

理想情况下,首先呈现包含多个商品的订单,然后展示 最常订购的单品。

有人可以提供一个如何构建此SQL的示例吗?

2 个答案:

答案 0 :(得分:1)

在两个项目一起出现的情况下,此查询生成所有请求的输出。它没有包含请求输出的最后一项,因为单个值(2)在技术上并不与任何内容一起出现......尽管您可以轻松添加UNION查询以包含单独发生的值。

这是为PostgreSQL 9.3编写的

 create table orders(
        order_id int, 
        item_id int, 
        amount int, 
        qty int, 
        date timestamp


);

INSERT INTO ORDERS VALUES(1,1,10,1,'10-10-2014');
INSERT INTO ORDERS VALUES(1,2,20,1,'10-10-2014');
INSERT INTO ORDERS VALUES(2,1,10,1,'10-12-2014');
INSERT INTO ORDERS VALUES(2,2,20,1,'10-12-2014');
INSERT INTO ORDERS VALUES(2,3,45,1,'10-12-2014');
INSERT INTO ORDERS VALUES(3,1,10,1,'9-9-2014');
INSERT INTO ORDERS VALUES(3,3,45,1,'9-9-2014');
INSERT INTO ORDERS VALUES(4,2,10,1,'11-11-2014');

with order_pairs as (
    select (pg1.item_id, pg2.item_id) as items, pg1.date
    from 
    (select distinct item_id, date
    from orders) as pg1
    join
    (select distinct item_id, date
    from orders) as pg2
    ON 
    (
    pg1.date = pg2.date AND
    pg1.item_id != pg2.item_id AND
    pg1.item_id < pg2.item_id

    )
    )

    SELECT items, count(*) as frequency
    FROM order_pairs
    GROUP by items
    ORDER by items;

输出

 items | frequency 
-------+-----------
 (1,2) |         2
 (1,3) |         2
 (2,3) |         1
(3 rows)

答案 1 :(得分:0)

加入市场篮子分析。 加入order_id并比较item_id < self.item_id。因此,对于每个item_id,您都可以销售相关商品。然后按项目分组并计算每个组合的行数。

select items,count(*) as 'Freq' from 
(select concat(x.item_id,',',y.item_id) as items from orders x 
JOIN orders y ON x.order_id = y.order_id and 
x.item_id != y.item_id and x.item_id < y.item_id) A 
group by A.items order by A.items;