Teradata
當 teradata 中既有空值又非空值時,如何選擇列的非空值?
考慮一個名為“TABLE-A”的表,其中包含以下數據。
ID hcc D_CD 1 null 1 1 5 1 2 null 2 2 10 2 2 20 3 3 null 3
我需要在 ID、D_CD 的組合中從 TABLE-A 中選擇 ID、hcc 欄位。當組合具有單個 hcc 值(即使它為空)時,應該獲取它。但是,當它同時具有空值和非空值時,它應該只獲取非空值。所以輸出必須如下。
輸出:
ID hcc 1 5 2 10 2 20 3 null
有人可以幫我嗎?提前致謝。
我為解決這個問題所做的是:
CREATE TABLE x ( id SMALLINT NOT NULL, hcc SMALLINT NULL, d_cd SMALLINT NOT NULL );
並填充它:
INSERT INTO x VALUES (1, null, 1), (1, 5 , 1), (2, null, 2), (2, 10, 2), (2, 20, 3), (3, null, 3);
然後執行這個查詢:
WITH y AS ( SELECT id, hcc FROM x WHERE hcc IS NOT NULL ), z AS ( SELECT id, hcc FROM x WHERE hcc IS NULL AND id NOT IN (SELECT id FROM y) ) SELECT id, hcc FROM y UNION SELECT id, hcc FROM z ORDER BY id;
結果:
ID hcc 1 5 2 10 2 20 3 null
如預期的!
將來,您能否提供一個關於您的表 DDL 和 DML 的小提琴!這應該適用於 Teradata - 我仔細檢查過,它確實支持公用表表達式!
根據您的描述,這是一個簡單的聚合:
select id, max(hcc) from x group by id, d_cd ;
如果您想要其他列,您可以使用 OLAP 函式應用相同的邏輯:
select * from x qualify rank() over (partition by id, d_cd order by hcc nulls last) = 1 ;
如果有多個非 NULL 值並且您想將它們全部返回:
select * from x qualify rank() over (partition by id, d_cd order by case when hcc is not null then 0 else 1 end) = 1 ;