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

如何使用多条件在SQL中从表中筛选单行数据

问题描述

从Salesforce Service Cloud导出的客户表Table_A存在同一邮箱对应多条记录的情况,需要按以下规则筛选出每个邮箱的唯一行:

  • 优先选择CONCAT(Owner_FirstName, Owner_LastName) = 'UserSCCIntegration'的行
  • 若符合上述条件的行有多条,再筛选SFCC_Customer_Number__pc不为NULL的行
    尝试用CASE WHEN实现但未成功,求正确SQL写法及CASE WHEN是否适用。

示例表结构及数据:

EmailCustomerTypeFirst_NameLast_NameOwner_FirstNameOwner_LastName
testA@email.comCustomerServiceAddNULLNULLPatriciaPortela
testA@email.comRegisteredSubscriberJohnSmithUserSCCIntegration
解决方案

CASE WHEN完全适用,核心思路是通过它给每条记录分配优先级分数,再结合窗口函数筛选每个邮箱的最高优先级记录。

具体SQL写法

WITH ranked_customers AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY Email 
            ORDER BY 
                CASE 
                    -- 最高优先级:Owner符合条件且SFCC编号非空
                    WHEN CONCAT(Owner_FirstName, Owner_LastName) = 'UserSCCIntegration' 
                         AND SFCC_Customer_Number__pc IS NOT NULL THEN 3
                    -- 次优先级:仅Owner符合条件
                    WHEN CONCAT(Owner_FirstName, Owner_LastName) = 'UserSCCIntegration' THEN 2
                    -- 最低优先级:Owner不符合条件
                    ELSE 1
                END DESC,
                -- 若同优先级仍有重复,可添加额外排序字段(比如最新创建时间,这里示例用CustomerType)
                CustomerType
        ) AS rn
    FROM Table_A
)
SELECT 
    Email,
    CustomerType,
    First_Name,
    Last_Name,
    Owner_FirstName,
    Owner_LastName,
    SFCC_Customer_Number__pc
FROM ranked_customers
WHERE rn = 1;

关键说明

  1. CASE WHEN在这里用来定义排序规则,把符合筛选条件的记录赋予更高的排序值,确保它们被优先选中。
  2. PARTITION BY Email将数据按邮箱分组,保证每个邮箱单独处理。
  3. ROW_NUMBER()会给每个邮箱组内的记录按优先级排序,rn=1就是该邮箱对应的最优记录。
  4. 如果同一优先级下仍有重复记录(比如多个满足Owner条件且SFCC编号非空的行),可以在ORDER BY后补充额外排序字段(如CreatedDate DESC取最新创建的记录),根据实际业务需求调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:12:13