【问题标题】:Finding the most frequently occurring combination寻找最常出现的组合
【发布时间】:2019-10-07 18:02:54
【问题描述】:

我有两个名为Orders 和Products 的表,order 表包含客户的特定订单数量,该订单中包含的产品在Products 表中。

我的要求是获取最常出现的产品的总订单数。 表示这些产品产品 1、产品 2、产品 3 的订单总数是多少,如果订单包含 10 个产品,其中包含产品 1、产品 2 和产品 3,则应计算该订单。

对于一个 order_id,可能会有多个产品,我对如何获得此结果感到困惑。有人可以分享或建议如何获得此结果的解决方案吗?

我正在使用 PostgreSQL。

以下是示例查询,

SELECT 
    "Orders"."order_id",pr.product_name
FROM 
    "data"."orders" AS "Orders"
    LEFT JOIN  data.items i On i."order_id"="Orders"."order_id" 
    LEFT join  data.products pr on pr."product_id"=i."product_id" 
WHERE TO_CHAR("Orders"."created_at_order",'YYYY-MM-DD') BETWEEN '2019-02-01' AND '2019-04-30'
ORDER BY  "Orders"."order_id"

Desired Result 将是这样的(3 列),购买次数最多的产品组合以及发生订单的数量。

产品 1、产品 2、产品 3 等.....,订单数量

这是样本数据输出,最需要组合购买的产品列表。(目前我只给出了3列样本,但可能会根据订单中的产品数量而有所不同)。

例子

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。此外,您的文本说“两个表”,但您的代码引用了三个表。非常混乱。
  • 嗨,戈登,非常感谢您的及时回复!在这种情况下,第三个表项并不重要,因为它用于链接其他两个表。我要显示的数据是前两个表。我将更新示例数据和所需的结果

标签: sql postgresql


【解决方案1】:
SELECT 
    "Orders"."order_id",
    string_agg(DISTINCT pr.product_name,::character varying, ',') AS product_name
    count(1) AS product_no
FROM 
    "data"."orders" AS "Orders"
    LEFT JOIN  data.items i On i."order_id"="Orders"."order_id" 
    LEFT join  data.products pr on pr."product_id"=i."product_id" 
WHERE TO_CHAR("Orders"."created_at_order",'YYYY-MM-DD') BETWEEN '2019-02-01' AND '2019-04-30'
GROUP BY "Orders"."order_id"
ORDER BY  count(1);

您可以尝试使用 group by 子句。

【讨论】:

  • 但是我需要产品组合,客户购买最多的组合。这不是我需要的。
  • 检查它@Rahul Singh
  • @SandeepSalim orderid的数据类型是什么
  • Order_id 是 BIGINT,由于执行代码时出现以下错误。错误:函数 string_agg(text) 不存在,我使用 array_agg 而不是 string_agg 将订单 id 转换为文本
  • @SandeepSalim 两者的功能或多或少相同。略有不同。我已经对查询进行了更改。请检查它是否正常工作。
【解决方案2】:

如果您想大致了解某些产品的订单数量,那么您可以只计算产品表中按产品分组的订单数量。查询应如下所示:

SELECT product_id, COUNT(*) 
FROM data.products
GROUP BY product_id
ORDER BY COUNT(*)
LIMIT 1;

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    尝试使用 GROUP BY 并取 MOST 计数值如下-

    SELECT 
    pr.product_name,
    COUNT(DISTINCT Orders.order_id)
    FROM 
    "data"."orders" AS "Orders"
    LEFT JOIN  data.items i On i."order_id"="Orders"."order_id" 
    LEFT join  data.products pr on pr."product_id"=i."product_id" 
    WHERE TO_CHAR("Orders"."created_at_order",'YYYY-MM-DD') BETWEEN '2019-02-01' AND '2019-04-30'
    GROUP BY pr.product_name
    ORDER BY COUNT(DISTINCT Orders.order_id) DESC
    LIMIT 1 -- You can use the LIMIT or NOT as per requirement
    

    【讨论】:

    • 检查了这个,它只是根据order_id给出每个产品的总数,但我需要购买最多的产品的组合。
    • 表示购买最多的产品组合及其数量。有没有办法得到它?
    • 查询应该返回最长时间可用的order_id/product_name的组合。
    • 嗨,要求是获取产品组合及其订单数量。假设如果在一个订单中有三个产品,我想获取包含这三个产品的订单数量。注意一个订单中可能有很多产品。
    • 那么您想要包含最多产品的 order_id 吗?
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多