如何在SELECT语句的WHERE子句中筛选仅归属Workflow A的产品序列号?
问题描述

需要编写SELECT语句提取仅处于Workflow "A"中的产品序列号,排除那些同时存在于Workflow A和B的序列号。
尝试过以下语句,但无法解决问题:
WHERE Workflow <> 'B'
因为这条语句还是会提取Workflow为'A'的行,哪怕该序列号同时有Workflow为'B'的记录。
请问能否在SELECT语句中解决该问题,还是需要在上游环节处理?
解决方案
完全可以在SELECT语句中解决,不需要上游处理,提供几种常用写法:
方法1:子查询排除法
SELECT SerialNumber, Workflow FROM your_table WHERE Workflow = 'A' AND SerialNumber NOT IN ( SELECT SerialNumber FROM your_table WHERE Workflow = 'B' );
方法2:LEFT JOIN筛选法
SELECT t1.SerialNumber, t1.Workflow FROM your_table t1 LEFT JOIN your_table t2 ON t1.SerialNumber = t2.SerialNumber AND t2.Workflow = 'B' WHERE t1.Workflow = 'A' AND t2.SerialNumber IS NULL;
方法3:窗口函数统计法
WITH serial_workflows AS ( SELECT SerialNumber, Workflow, COUNT(DISTINCT Workflow) OVER (PARTITION BY SerialNumber) AS workflow_count FROM your_table ) SELECT SerialNumber, Workflow FROM serial_workflows WHERE Workflow = 'A' AND workflow_count = 1;
以上三种写法都能精准筛选出仅属于Workflow A的序列号,不会包含同时存在Workflow B的记录。
内容的提问来源于stack exchange,提问作者AlbumBlast
相关产品推荐
相关产品推荐

