SQL查询如何为同一Customer_ID优先选取非空OrderDate值
问题原因分析
你原来的SQL无法得到预期结果核心有两个问题:
- 缺少
GROUP BY子句:在绝大多数主流数据库的严格语法模式下,SELECT中的非聚合字段必须出现在GROUP BY子句中,否则会直接报错或者返回不符合预期的聚合结果。 - 没有明确聚合维度:你需要先确认是按
Customer_ID + Products分组聚合,还是按Customer_ID统一处理同个用户的所有OrderDate。
正确实现方案
方案1:按Customer_ID + Products分组(最常用,匹配多数业务场景)
如果你的需求是每个客户+产品的组合返回一条对应的OrderDate记录,使用如下写法即可:
SELECT Customer_ID, Products, MAX(OrderDate) AS OrderDate FROM `table` GROUP BY Customer_ID, Products ORDER BY Customer_ID, Products
逻辑完全符合你的要求:
- 同一分组内如果同时存在NULL和非NULL的OrderDate,
MAX函数会自动忽略NULL值,返回非NULL的结果 - 同一分组内如果只有NULL值,
MAX会返回NULL,满足直接返回的规则
方案2:同Customer_ID统一返回OrderDate
如果你需要同一个客户下所有记录的OrderDate都统一为该客户存在的非NULL值(和产品无关),可以用窗口函数实现:
SELECT DISTINCT Customer_ID, Products, MAX(OrderDate) OVER (PARTITION BY Customer_ID) AS OrderDate FROM `table` ORDER BY Customer_ID, Products
内容的提问来源于stack exchange,提问作者Hanry_Lou
相关产品推荐
相关产品推荐

