如何使用多条件在SQL中从表中筛选单行数据
问题描述
从Salesforce Service Cloud导出的客户表Table_A存在同一邮箱对应多条记录的情况,需要按以下规则筛选出每个邮箱的唯一行:
- 优先选择
CONCAT(Owner_FirstName, Owner_LastName) = 'UserSCCIntegration'的行 - 若符合上述条件的行有多条,再筛选
SFCC_Customer_Number__pc不为NULL的行
尝试用CASE WHEN实现但未成功,求正确SQL写法及CASE WHEN是否适用。
示例表结构及数据:
| CustomerType | First_Name | Last_Name | Owner_FirstName | Owner_LastName | |
|---|---|---|---|---|---|
| testA@email.com | CustomerServiceAdd | NULL | NULL | Patricia | Portela |
| testA@email.com | RegisteredSubscriber | John | Smith | User | SCCIntegration |
解决方案
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;
关键说明
CASE WHEN在这里用来定义排序规则,把符合筛选条件的记录赋予更高的排序值,确保它们被优先选中。PARTITION BY Email将数据按邮箱分组,保证每个邮箱单独处理。ROW_NUMBER()会给每个邮箱组内的记录按优先级排序,rn=1就是该邮箱对应的最优记录。- 如果同一优先级下仍有重复记录(比如多个满足Owner条件且SFCC编号非空的行),可以在
ORDER BY后补充额外排序字段(如CreatedDate DESC取最新创建的记录),根据实际业务需求调整。
内容的提问来源于stack exchange,提问作者Tiago
相关产品推荐
相关产品推荐

