SQL列出购买的其他产品,并按最初购买的产品统计买家
在阅读了多年的答案后,终于到了自己问问题的时候了 我有一个购买的产品列表和唯一的客户ID:SQL列出购买的其他产品,并按最初购买的产品统计买家,sql,netezza,market-basket-analysis,Sql,Netezza,Market Basket Analysis,在阅读了多年的答案后,终于到了自己问问题的时候了 我有一个购买的产品列表和唯一的客户ID: +---------+--------+ | Product | Buyer | +---------+--------+ | Apples | Rod | | Apples | Jane | | Apples | Freddy | | Bananas | Rod | | Bananas | Jane | | Bananas | Freddy | | Bananas | Zip
+---------+--------+
| Product | Buyer |
+---------+--------+
| Apples | Rod |
| Apples | Jane |
| Apples | Freddy |
| Bananas | Rod |
| Bananas | Jane |
| Bananas | Freddy |
| Bananas | Zippy |
| Pears | Rod |
| Pears | Zippy |
+---------+--------+
我想在Netezza SQL中生成以下输出:
+-----------+-------------+------------------------+---------------------+
| Product A | Buyers of A | A Buyers Also Bought B | No of A Buyers of B |
+-----------+-------------+------------------------+---------------------+
| Apples | 3 | Bananas | 3 |
| Apples | 3 | Pears | 1 |
| Bananas | 4 | Apples | 3 |
| Bananas | 4 | Pears | 2 |
| Pears | 2 | Apples | 1 |
| Pears | 2 | Bananas | 2 |
+-----------+-------------+------------------------+---------------------+
…这样我就可以看到,每种产品的总购买者。至关重要的是,我还想看看,对于每种产品,在这些购买者中,有多少人购买了同一列表中的其他产品编辑:必须重申,如果B栏中没有买家也购买产品A,我不应该让他们出现在B栏中
请问最有效的方法是什么
(然后我将计算出B购买a的百分比,但这部分很简单)
谢谢大家! 您可以创建计数摘要,然后与自身交叉连接,排除相同的匹配项 像这样:
SELECT
A.Product,
A.Buyers,
B.Product,
B.Buyers
FROM (
SELECT
Product
count(*) AS Buyers
FROM
ProductBuyers
GROUP BY
) AS A
CROSS JOIN (
SELECT
Product
count(*) AS Buyers
FROM
ProductBuyers
GROUP BY
) AS B
WHERE
A.Product != B.Product
常见采购的基本数据是自连接和
分组依据
:
select p1.product, p2.product, count(*) as in_common
from purchases p1 join
purchases p2
on p1.buyer = p2.buyer
group by p1.product, p2.product;
要获取其中一个(或另一个)的计数,则需要一个连接:
select p1.product, p2.product, pp.cnt, count(*) as in_common
from purchases p1 join
purchases p2
on p1.buyer = p2.buyer join
(select p1.product, count(*) as cnt
from purchases
group by p1.product
) pp
on pp.product = p1.product
group by p1.product, p2.product, pp.cnt;
或者,您可以使用窗口功能:
select p1.product, p1.cnt, p2.product, count(*) as in_common
from (select p1.*,
count(*) over (partition by p1.product) as cnt
from purchases p1
) p1 join
purchases p2
on p1.buyer = p2.buyer
group by p1.product, p2.product, p1.cnt;
rextester是否显示其工作正常。感谢您的快速响应!然而,这似乎对我不起作用——每种产品的两列中的数字都是相同的(每次只给出表中的总数)。他们只是点了不同的菜。为了让它运行,我还必须在子查询A和B中的Product后面加上“1”和逗号,谢谢您的快速响应!不幸的是,我得到的结果与Alan的代码中的结果相同。它只是告诉我每种产品的总数量。有可能我在最初的问题中没有把这一点说得足够清楚——我只是在第二次统计中寻找这两种产品的买家,而不是所有的买家。输出表应该使这一点更清楚。当然,除非我使用的代码不正确。@baaweepgranna。这根本不是事实,除非Netezza破产。我已经包括了一个Rextester,显示它在Postgres中工作。