我希望我的这篇文章没有违反任何规则,我有一个表(在instacart数据库中)叫做order_products,它有order_id和product_id列,描述了每个订单中购买的产品。
下面是创建表
-- Name: order_products; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.order_products (
order_id integer NOT NULL,
product_id integer NOT NULL,
add_to_cart_order integer,
reordered integer
);
以下是所要求的数据示例
----------+------------+
| Order_id | Product_id |
+----------+------------+
| 123 | 741 |
+----------+------------+
| 123 | 742 |
+----------+------------+
| 123 | 852 |
+----------+------------+
| 234 | 852 |
+----------+------------+
| 234 | 963 |
+----------+------------+
| 456 | 741 |
+----------+------------+
| 456 | 742 |
+----------+------------+
| 456 | 201 |
+----------+------------+
| 456 | 202 |
+----------+------------+
| 567 | 741 |
+----------+------------+
| 567 | 742 |
+----------+------------+
| 567 | 201 |
+----------+------------+
| 789 | 963 |
+----------+------------+
| 789 | 201 |
+----------+------------+
| 789 | 202 |
+----------+------------+
| 789 | 203 |
+----------+------------+
| 789 | 204 |
+----------+------------+
| 100 | 741 |
+----------+------------+
| 100 | 741 |
+----------+------------+
| 100 | 201 |
+----------+------------+
我想查询在一个订单中一起订购次数最多的对。在上面的例子中,它将是产品ID 741和742对,因为它们在一个订单中一起订购了4次。
我基于自连接尝试了以下操作
SELECT p1.product_id, count(p1.product_id), p2.product_id, count(p2.product_id)
FROM order_products AS p1, order_products AS p2
WHERE p1.order_id = p2.order_id
GROUP BY p1.product_id, p2.product_id
ORDER BY 2 DESC
运气不好,因为它只返回购买次数最多的产品和数量的两倍,而我需要的是购买次数最多的一对产品在一起,我没有线索解决这个问题,有人能帮我吗?谢谢
1条答案
按热度按时间tzdcorbm1#
可以按如下方式使用自联接和聚合:(此操作将退回一起购买的所有成对产品)
如果您想退回 * 一起购买最多的一对产品 *,可以使用
DENSE_RANK
函数,如下所示:参见demo。