SQL需求:筛选购买相同数量产品且客户组数量匹配的记录
正确解决你的客户记录筛选问题
首先我注意到你的需求描述和期望输出之间有个小歧义:你说要筛选“购买产品数量相同的客户组中客户数≥2”的记录,但你的例子里c5购买数量是1,和c3、c4一样,却被排除了——结合期望输出来看,你实际想要的应该是筛选出那些和至少1个客户购买完全相同产品集合的客户的所有记录(比如c1和c2都买了1、2、3,c3和c4都买了5,而c5只买了3,没有其他客户和他买的一样,所以排除)。
我先对应你的期望输出给出正确的SQL解法:
方法一:按产品集合分组筛选
假设你的表名为customer_products,可以用CTE(公共表表达式)分步实现:
WITH customer_product_groups AS ( -- 第一步:给每个客户的购买产品生成唯一标识(有序拼接产品ID,确保相同产品集合的客户得到相同字符串) SELECT customer_id, STRING_AGG(product_id, ',' ORDER BY product_id) AS product_list FROM customer_products GROUP BY customer_id ), valid_groups AS ( -- 第二步:找出有至少2个客户的产品集合 SELECT product_list FROM customer_product_groups GROUP BY product_list HAVING COUNT(customer_id) >= 2 ) -- 第三步:关联原表,取出所有符合条件的客户记录 SELECT cp.customer_id, cp.product_id FROM customer_products cp JOIN customer_product_groups cpg ON cp.customer_id = cpg.customer_id JOIN valid_groups vg ON cpg.product_list = vg.product_list ORDER BY cp.customer_id, cp.product_id;
如果确实是按购买数量筛选(修正需求歧义)
如果你真的是要按购买产品数量分组,保留购买数量对应的客户数≥2的那些客户的记录,那SQL会是这样:
WITH customer_purchase_counts AS ( -- 计算每个客户的购买产品总数 SELECT customer_id, COUNT(product_id) AS purchase_count FROM customer_products GROUP BY customer_id ), valid_counts AS ( -- 找出有至少2个客户的购买数量分组 SELECT purchase_count FROM customer_purchase_counts GROUP BY purchase_count HAVING COUNT(customer_id) >= 2 ) SELECT cp.customer_id, cp.product_id FROM customer_products cp JOIN customer_purchase_counts cpc ON cp.customer_id = cpc.customer_id JOIN valid_counts vc ON cpc.purchase_count = vc.purchase_count ORDER BY cp.customer_id, cp.product_id;
不过这个查询会包含c5的记录,因为他的购买数量1对应的客户数有3个(c3、c4、c5),和你的期望输出不符,所以更推荐第一个方法。
你的原查询问题出在哪
你原来的查询是基于单个product_id去关联其他订单,逻辑是找有相同产品的其他订单,这和你的需求完全不匹配——你的需求是按客户的整体购买情况(产品集合或购买数量)分组筛选,而不是单个产品的重复购买。
内容的提问来源于stack exchange,提问作者ganesh
相关产品推荐
相关产品推荐

