如何在Teradata SQL中按单列双条件过滤数据?
Teradata SQL 筛选同时包含CLASS1和NULL且无其他CLASS的客户所有记录
正确实现方法
你需要的是客户级别的过滤:筛选出那些CUST_ID对应的所有记录中,仅包含CLASS1和NULL(没有其他CLASS值,比如CLASS2)的客户,再保留这些客户的所有行。以下是两种可行的实现方式:
方法1:子查询筛选符合条件的客户ID
SELECT d.CUST_ID, d.SALES, d.CLASS FROM DATASET1 d WHERE d.CUST_ID IN ( SELECT CUST_ID FROM DATASET1 GROUP BY CUST_ID -- 三个条件确保客户仅包含CLASS1和NULL HAVING COUNT(DISTINCT CASE WHEN CLASS IS NOT NULL THEN CLASS END) = 1 AND MAX(CASE WHEN CLASS = 'CLASS1' THEN 1 ELSE 0 END) = 1 AND MAX(CASE WHEN CLASS IS NULL THEN 1 ELSE 0 END) = 1 );
方法2:窗口函数标记客户状态后过滤
WITH customer_class_validation AS ( SELECT CUST_ID, SALES, CLASS, -- 统计客户非NULL的CLASS种类数 COUNT(DISTINCT CASE WHEN CLASS IS NOT NULL THEN CLASS END) OVER (PARTITION BY CUST_ID) AS non_null_class_count, -- 标记客户是否有CLASS1记录 MAX(CASE WHEN CLASS = 'CLASS1' THEN 1 ELSE 0 END) OVER (PARTITION BY CUST_ID) AS has_class1, -- 标记客户是否有NULL记录 MAX(CASE WHEN CLASS IS NULL THEN 1 ELSE 0 END) OVER (PARTITION BY CUST_ID) AS has_null FROM DATASET1 ) SELECT CUST_ID, SALES, CLASS FROM customer_class_validation WHERE non_null_class_count = 1 AND has_class1 = 1 AND has_null = 1;
你之前的错误说明
语法错误的IN语句:
你的语句WHERE CLASS IS IN ('CLASS1' OR 'NULL');存在两处问题:- IN子句不能用OR,正确的行级筛选(仅取CLASS1或NULL)应该是
WHERE CLASS = 'CLASS1' OR CLASS IS NULL - NULL不能用
IN ('NULL')判断,必须用CLASS IS NULL
- IN子句不能用OR,正确的行级筛选(仅取CLASS1或NULL)应该是
过滤维度错误:
单纯的行级筛选(只选CLASS1或NULL的行)无法排除CUST_ID=2这类客户,因为该客户的NULL行也会被选中,但你需要的是整个客户的所有记录都只包含CLASS1和NULL,所以必须先对客户进行聚合判断,再筛选对应的行。
内容的提问来源于stack exchange,提问作者cmdublin
相关产品推荐
相关产品推荐

