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
相关产品推荐
相关产品推荐

