Teradata

當 teradata 中既有空值又非空值時,如何選擇列的非空值?

  • January 22, 2022

考慮一個名為“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
;

引用自:https://dba.stackexchange.com/questions/281337