Snowflake SQL问题:如何筛选购买过X产品且同时购买Y产品的客户
解决同时购买X/Y类产品的客户查询问题
原查询返回空结果的核心原因:WHERE子句要求同一条销售记录的product_no同时属于X和Y产品列表,但题目明确X、Y产品无重合,这个条件永远无法满足,因此返回空。
以下是三种可行的Snowflake SQL解决方案:
方法1:分组聚合+Having筛选
通过分组统计客户的购买记录,判断其是否同时购买过X和Y类产品:
SELECT s.cust FROM sales s INNER JOIN product p ON s.product_no = p.product_no WHERE s.product_no IN (SELECT X_product_no FROM X_product_list) OR s.product_no IN (SELECT Y_product_no FROM Y_product_list) GROUP BY s.cust HAVING SUM(CASE WHEN s.product_no IN (SELECT X_product_no FROM X_product_list) THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN s.product_no IN (SELECT Y_product_no FROM Y_product_list) THEN 1 ELSE 0 END) > 0;
方法2:EXISTS子查询验证
分别检查客户是否存在购买X、Y产品的独立记录,适合大数据集(索引优化后性能更优):
SELECT DISTINCT s.cust FROM sales s INNER JOIN product p ON s.product_no = p.product_no WHERE EXISTS (SELECT 1 FROM sales s2 WHERE s2.cust = s.cust AND s2.product_no IN (SELECT X_product_no FROM X_product_list)) AND EXISTS (SELECT 1 FROM sales s3 WHERE s3.cust = s.cust AND s3.product_no IN (SELECT Y_product_no FROM Y_product_list));
方法3:集合交集取共同客户
先分别筛选购买过X、Y产品的客户,再取两个集合的交集:
SELECT cust FROM ( SELECT DISTINCT s.cust FROM sales s INNER JOIN product p ON s.product_no = p.product_no WHERE s.product_no IN (SELECT X_product_no FROM X_product_list) ) x_customers INTERSECT SELECT cust FROM ( SELECT DISTINCT s.cust FROM sales s INNER JOIN product p ON s.product_no = p.product_no WHERE s.product_no IN (SELECT Y_product_no FROM Y_product_list) ) y_customers;
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

