【问题标题】:How to find cross selling products in postgres如何在 postgres 中找到交叉销售产品
【发布时间】:2020-08-30 21:13:54
【问题描述】:

我必须创建一个显示产品交叉销售的报告,这意味着如果我有一个产品 X,我需要找到该产品与其他产品购买的组合并且它是计数的。

所以我的表结构如下,

以下是相同的数据。参考是订单号,每个项目都有一个单独的行显示产品和类别的详细信息。

Reference.      Product Name.        Prod ID.       Category
1000001         Honda x12            10023           Machinery
1000001         Honda cv12           10025           Machinery
1000002         Medic. 12x           10026           Medicine
1000002         Honda x12            10023           Machinery
1000003         Honda x12            10023           Machinery
1000004         Appliance x12        10033           Household
1000004         Honda x12            10023           Machinery
1000005         Bag x234             100265          Bags

我希望输出是这样的, 假设我想找到本田 x12 的交叉销售产品,这意味着我想知道哪些是与本田 x12 组合销售的产品以及特定组合计数发生的次数。

谁能建议我如何在 PostgreSQL(版本 11)中做到这一点。

提前致谢

【问题讨论】:

    标签: postgresql join group-by count


    【解决方案1】:

    我认为这是一个带有不等式条件的自联接:

    select t.prod_id prod_id1, x.prod_id prod_id2, count(*) cnt
    from mytable t
    inner join mytable x 
        on  x.reference = t.reference
        and x.prod_id > t.prod_id
    group by t.prod_id, x.prod_id
    order by 1, 2
    

    > 故意在连接谓词中而不是<> 中,以避免结果集中出现“镜像”记录。

    对于您的示例数据,this generates:

    prod_id1 | prod_id2 | cnt --------: | --------: | --: 10023 | 10025 | 1 10023 | 10026 | 1 10023 | 10033 | 1

    这会一次性为您提供所有产品的结果。如果您只想要给定产品的“对”列表,则略有不同:

    select t.prod_id, count(*) cnt
    from mytable t
    inner join mytable x 
        on  x.reference = t.reference
        and x.prod_id <> t.prod_id
    where x.prod_id = 10023
    group by t.prod_id
    order by 1
    

    Demo

    prod_id | cnt ------: | --: 10025 | 1 10026 | 1 10033 | 1

    【讨论】:

    • @GMB 我们可以有多个组合,比如三个或四个组合,上面的只是列出了两个组合对吗?还有没有更好的方法来展示它们?请指导,将非常有帮助!
    • @Bergi可以有1个以上的组合,反正我们能搞定!
    • @Linu:这似乎可以满足您的需求。否则,请更新我在答案中添加的小提琴,并说明您对结果的不满意之处。
    猜你喜欢
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2015-05-30
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多