寻找最常出现的组合

时间:2019-05-21 10:49:10

标签: sql postgresql

enter image description here enter image description here我有两个表,名称分别为Orders and Products(订单和产品),order表包含一个客户的特定订单数量,该订单中包含的产品位于Products表中。 / p>

我的要求是获取最经常出现的产品的总订单数。 表示这些产品的产品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"

enter image description here

期望的结果将是这样(3列),这是购买最多的产品组合,包含已发生订单的数量。

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

这是示例数据输出,需要组合购买最多的产品列表。(到目前为止,我仅给出3列示例,但可能会根据订单中的产品数量而有所不同。)< / p>

和示例

3 个答案:

答案 0 :(得分:0)

如果您通常希望获得某些产品的订单数量,则只需从产品表中计算按产品分组的订单数量即可。查询应如下所示:

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

希望这会有所帮助!

答案 1 :(得分:0)

尝试使用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

答案 2 :(得分:0)

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子句。