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

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 DESC
  • row_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:28:26