8WeekSQLChallenge:查询客户首次购买商品遇SQL语法错误求助
排查SQL语法错误:获取每个客户首次购买的商品
错误原因分析
你的SQL报错核心有两点:
- 语法错误:用
=匹配了返回多行结果的子查询。子查询SELECT MIN(sales.order_date) FROM dannys_diner.sales GROUP BY sales.customer_id会输出每个客户的首次购买日期(共3行数据),而=运算符仅支持匹配单个值,因此触发语法报错。 - 逻辑漏洞:即便把
=改成IN,原代码也会把所有订单日期等于任意客户首次日期的记录全部拉出,无法精准匹配每个客户自己的首次订单商品。
修正方案
方案1:关联子查询(精准匹配单客户首次日期)
通过主查询与子查询关联customer_id,确保每个客户只匹配自己的首次购买日期,此时子查询对单个客户返回唯一值,可用=匹配:
SELECT s.customer_id, s.product_id FROM dannys_diner.sales s WHERE s.order_date = ( SELECT MIN(s2.order_date) FROM dannys_diner.sales s2 WHERE s2.customer_id = s.customer_id );
方案2:窗口函数(兼容多商品首次购买场景)
如果存在客户在首次购买日同时下单多个商品的情况,用ROW_NUMBER()窗口函数可以一次性筛选出所有符合条件的商品:
SELECT customer_id, product_id FROM ( SELECT customer_id, product_id, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS rn FROM dannys_diner.sales ) t WHERE rn = 1;
验证结果
两种方案都会返回正确的首次购买商品数据:
| customer_id | product_id |
|---|---|
| A | 1 |
| A | 2 |
| B | 2 |
| C | 3 |
| C | 3 |
内容的提问来源于stack exchange,提问作者Ashvend
相关产品推荐
相关产品推荐

