我正在使用SAS进行一项课程。目前,我有一组订单ID和产品ID。我想知道哪些产品最常订购。想想,牛奶和谷物在杂货篮。
我不擅长编程,所以如果有人可以节省一点时间并编写一些我可以轻松使用的简单几行SQL,我将非常感激。它不是一个繁重的数据集,只有两列(Order_ID和Product_ID)
例如:
订单ID 产品ID
10001 64564564
10001 546456
10001 54646
10003 5464
10003 342346
我现在花了三个小时研究并且有点绝望:(
答案 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
一起订购的产品根本不会出现。此外 - 对表示两次 - 一排用于带牛奶的鸡蛋,一排用于带有鸡蛋的牛奶。这些重复对是可移除的 - 但它变得更加丑陋 - 简单就好了。
为了详细说明,p1
和p2
是订单的别名。您这样做是为了能够多次使用数据源 - 然后区分它们。此外,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;。