如何筛选出购买次数超过1次的客户的关联销售数据?
解决方法
你之前的代码问题在于:使用case语句只是新增了一个条件判断字段,并没有过滤掉不符合条件的记录,所以结果仍然包含所有客户的数据。以下是几种正确的实现方式:
方式一:IN子查询过滤
SELECT * FROM sales s JOIN closest_dealerships cd ON s.customer_id = cd.customer_id WHERE s.customer_id IN ( SELECT customer_id FROM sales GROUP BY customer_id HAVING COUNT(*) > 1 ) ORDER BY s.customer_id;
逻辑:先从sales表中筛选出购买次数超过1次的客户ID列表,再用这个列表过滤关联后的结果,只保留目标客户的全部记录。
方式二:EXISTS子查询(推荐大表使用)
SELECT * FROM sales s JOIN closest_dealerships cd ON s.customer_id = cd.customer_id WHERE EXISTS ( SELECT 1 FROM sales s2 WHERE s2.customer_id = s.customer_id GROUP BY s2.customer_id HAVING COUNT(*) > 1 ) ORDER BY s.customer_id;
逻辑:逐行检查当前记录的客户ID是否存在于“购买次数>1”的分组中,存在则保留该记录,性能通常优于IN子查询(尤其数据量大时)。
方式三:CTE预筛选客户(逻辑更清晰)
WITH repeat_customers AS ( SELECT customer_id FROM sales GROUP BY customer_id HAVING COUNT(*) > 1 ) SELECT s.*, cd.* FROM repeat_customers rc JOIN sales s ON rc.customer_id = s.customer_id JOIN closest_dealerships cd ON rc.customer_id = cd.customer_id ORDER BY s.customer_id;
逻辑:先用CTE定义出重复购买的客户集合,再与sales和closest_dealerships表关联,代码可读性更强。
内容的提问来源于stack exchange,提问作者New Learner
相关产品推荐
相关产品推荐

