You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

8WeekSQLChallenge:查询客户首次购买商品遇SQL语法错误求助

排查SQL语法错误:获取每个客户首次购买的商品

错误原因分析

你的SQL报错核心有两点:

  1. 语法错误:用=匹配了返回多行结果的子查询。子查询SELECT MIN(sales.order_date) FROM dannys_diner.sales GROUP BY sales.customer_id会输出每个客户的首次购买日期(共3行数据),而=运算符仅支持匹配单个值,因此触发语法报错。
  2. 逻辑漏洞:即便把=改成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_idproduct_id
A1
A2
B2
C3
C3

内容的提问来源于stack exchange,提问作者Ashvend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:05:08