SFMC SQL查询:如何从指定Shipment_Type中选取客户首条记录
修正SQL查询:每个客户仅保留符合条件的首条订单记录
核心思路
要实现每个Customer_ID仅保留Shipment_Type为'A'、'C'、'E'的首条订单记录,关键是给每个客户的符合条件订单分组排序,再筛选出每组的第一条。以下是两种可行方案:
方案一:窗口函数ROW_NUMBER()(推荐)
这是通用且高效的方式,适配Salesforce Marketing Cloud(SFMC)的Data Extension SQL:
SELECT c.*, o.Order_ID, o.Shipment_Type, o.Order_Date -- 按需选择Orders表的其他字段 FROM Customers c INNER JOIN ( SELECT *, -- 按客户ID分组,按订单日期升序生成序号 ROW_NUMBER() OVER (PARTITION BY Customer_ID ORDER BY Order_Date ASC) AS row_num FROM Orders WHERE Shipment_Type IN ('A', 'C', 'E') ) o ON c.Customer_ID = o.Customer_ID -- 仅保留每组第一条记录 WHERE o.row_num = 1;
关键说明:
PARTITION BY Customer_ID:将订单按客户ID分组,每个客户的订单单独处理ORDER BY Order_Date ASC:定义“首条”规则——这里取最早创建的订单;若要取最新订单,改为ORDER BY Order_Date DESCrow_num = 1:筛选出每个客户分组内的第一条记录
方案二:子查询筛选唯一订单标识
如果Orders表有唯一的Order_ID,且“首条”对应最小的Order_ID,可以用这种方式:
SELECT c.*, o.* FROM Customers c INNER JOIN Orders o ON c.Customer_ID = o.Customer_ID WHERE o.Shipment_Type IN ('A', 'C', 'E') AND o.Order_ID IN ( -- 每个客户取符合条件的最小Order_ID SELECT MIN(Order_ID) FROM Orders WHERE Shipment_Type IN ('A', 'C', 'E') GROUP BY Customer_ID );
注意事项:
- 若“首条”定义不是日期或订单ID,替换对应的排序/聚合字段即可
- 确保
Customer_ID是两张表关联的正确字段 - SFMC完全支持窗口函数,方案一的灵活性和可读性更好
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

