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

SQL Server按Customer_ID与Brand获取用户首单的异常问题求助

问题原因及修正方案

你的查询结果未区分Customer_ID,核心原因是子查询存在列名歧义:
你写的where h.Customer_ID = Customer_ID and H.Brand = Brand中,SQL会将等号两边的列都判定为子查询里H表的列,条件等价于h.Customer_ID = h.Customer_ID(恒成立)。再加上TOP 1,最终会返回该Brand下所有订单的最早日期,而非每个Customer_ID+Brand组合的首单。


方案一:用窗口函数直接计算(推荐,更高效)

直接在外层通过FIRST_VALUE窗口函数,按Customer_ID, Brand分区、按日期排序,一次得到每个组合的首单:

SELECT 
    O.Data, 
    O.Brand,  
    O.Customer_ID,
    FIRST_VALUE(O.Data) OVER (PARTITION BY O.Customer_ID, O.Brand ORDER BY O.Data ASC) AS first_order
FROM [ORDER] O
LEFT OUTER JOIN ORDER_SOURCE SRC ON SRC.SRC_ID = O.ORDR_SOURCE
WHERE SRC.SRC_NAME IN ('SR 1', 'SR 2') 
  AND O.DATE = '2022-01-01'

注意点:

  • ORDER是SQL关键字,必须用方括号[ORDER]包裹,避免语法错误;
  • 给主表加别名O,明确列的归属,彻底消除歧义;
  • 窗口函数会自动为每个Customer_ID+Brand分组计算首单日期。

方案二:修正子查询的列名歧义

如果坚持用子查询,需明确指定外层表的列(加别名区分),同时简化子查询逻辑(直接排序取TOP1即可):

SELECT 
    O.Data, 
    O.Brand,  
    O.Customer_ID,
    (
        SELECT TOP 1 H.Data
        FROM [ORDER] H
        WHERE H.Customer_ID = O.Customer_ID 
          AND H.Brand = O.Brand
        ORDER BY H.Data ASC
    ) AS first_order
FROM [ORDER] O
LEFT OUTER JOIN ORDER_SOURCE SRC ON SRC.SRC_ID = O.ORDR_SOURCE
WHERE SRC.SRC_NAME IN ('SR 1', 'SR 2') 
  AND O.DATE = '2022-01-01'

修正后,每个Customer_ID+Brand组合都会返回自身的最早订单日期,不再出现同一Brand下所有客户共享首单的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:41:12