Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL列出购买的其他产品,并按最初购买的产品统计买家_Sql_Netezza_Market Basket Analysis - Fatal编程技术网

SQL列出购买的其他产品,并按最初购买的产品统计买家

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

在阅读了多年的答案后,终于到了自己问问题的时候了

我有一个购买的产品列表和唯一的客户ID:

+---------+--------+
| 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中工作。