频繁项集SQL

时间:2015-04-18 19:52:30

标签: sql frequency

我正在使用SAS进行一项课程。目前,我有一组订单ID和产品ID。我想知道哪些产品最常订购。想想,牛奶和谷物在杂货篮。

我不擅长编程,所以如果有人可以节省一点时间并编写一些我可以轻松使用的简单几行SQL,我将非常感激。它不是一个繁重的数据集,只有两列(Order_ID和Product_ID)

例如:

订单ID 产品ID

10001 64564564

10001 546456

10001 54646

10003 5464

10003 342346

我现在花了三个小时研究并且有点绝望:(

2 个答案:

答案 0 :(得分:1)

如果您考虑一下,您可以通过这样询问问题找到答案:对于每一对可能的产品,这两种产品在同一订单上出现的次数。然后按计数顺序将答案浮动到顶部:

select 
    p1.product_id, p2.product_id, count(*) times_order_together 
from
    orders p1
    inner join
    orders p2
    on
        p1.order_id = p2.order_id
        and
        p1.product_id != p2.product_id 
group by
    p1.product_id, p2.product_id
order by
    count(*) desc 

一起订购的产品根本不会出现。此外 - 对表示两次 - 一排用于带牛奶的鸡蛋,一排用于带有鸡蛋的牛奶。这些重复对是可移除的 - 但它变得更加丑陋 - 简单就好了。

为了详细说明,p1p2是订单的别名。您这样做是为了能够多次使用数据源 - 然后区分它们。此外,count(*) times_order_together只是将名称“times_order_together”赋予计算count(*)。它计算订单中产品配对的次数。

答案 1 :(得分:0)

如下:

create table order_together (order_id, product_id1, product_id2);

insert into order_together
(order_id, product_id1, product_id2)
select o1.order_id, o1.product_id, o2.product_id
from order_line o1, order_line o2
where o1.order_id = o2.order_id 

/* you dont want them equal and you also dont
want to insert cereal-milk and milk-cereal on the same order*/
and o1.product_id < o2.product_id

现在你有一对产品,你可以疯狂地计算和统计数据。请注意,这很天真,而且会很快爆发。

也许

select count(distinct order_id), o1.product_id, o2.product_id 
... 
group by o1.product_id, o2.product_id 

会更好。

回应发表评论

但是你要抓住一对订购的产品,这些产品来自同一订单的订单行的不同行。

在sqlfiddle.com上试试这个

将其放在左侧,构建架构窗格。它会创建表格。

create table order_line(order_no int, product_id varchar(10));

create table order_together(order_no int, product_id1 varchar(10), product_id2 varchar(10));

将其放在右窗格中,运行SQL

insert into order_line(order_no, product_id) values(1, 'milk');
insert into order_line(order_no, product_id) values (1, 'cereal');
insert into order_line(order_no, product_id) values (1, 'rice');
insert into order_line(order_no, product_id) values (2, 'milk');
insert into order_line(order_no, product_id) values (2, 'cereal');

insert into order_line(order_no, product_id) values (3, 'milk');
insert into order_line(order_no, product_id) values (3, 'cookies');
insert into order_line(order_no, product_id) values(4, 'milk');
insert into order_line(order_no, product_id) values (4, 'cookies');
insert into order_line(order_no, product_id) values(5, 'rice');
insert into order_line(order_no, product_id) values (5, 'icecream');

select o1.order_no, o1.product_id as product_from_row1, o2.product_id as product_from_row2
from order_line o1, order_line o2
where o1.order_no = o2.order_no
and o1.product_id < o2.product_id                            

给出:

order_no    product_from_row1   product_from_row2
1   milk    rice
1   cereal  milk
1   cereal  rice
2   cereal  milk
3   cookies     milk
4   cookies     milk
5   icecream    rice

尝试一下,然后考虑一下查询请求的内容,即加入相同顺序的不同order_lines。这几乎是&#34;定义的定义&#34;。