Проверьте все NULL в группе - PullRequest
0 голосов
/ 11 июня 2019

Найдите, являются ли все определенные столбцы в группе значениями NULL, затем заполните целевой объект соответствующим образом.У меня есть набор записей, как указано ниже.Мое требование состоит в том, чтобы заполнить выходной столбец «total» на основе - 1) Внутри группы (или раздела), если столбец «trans_dt» во всех строках имеет значение NULL, затем заполните столбец «total» в выходных данных как zer0. 2) Еслилюбая из записей имеет допустимое значение (в столбце trans_dt), затем заполняет «total» максимальным значением «items» для этой группы, а trans_dt в качестве MAX trans_dt для этой группы

custid|transact_dt|items  
------------------------  
1234|05/01/2019|3  
1234|10/02/2019|4  
1234|Null|3  
5678|Null|5  
5678|Null|3  
5678|Null|1  
5678|Null|2 

В указанном выше наборе записей custid «1234» имеет допустимые значения в trans_dt в 2 рядах, поэтому выходной столбец «total» должен быть заполнен как «4».Однако для custid "5678" все значения trans_dt имеют значение Null, поэтому значение "total" должно быть заполнено как 0.

custid|transact_dt|items  
------------------------  
1234|10/02/2019|4  
5678|31/12/9999|0  
select custid, max_trans_dt, 
CASE WHEN max_trans_dt IS NULL then 0
ELSE total  
END as total
from 
( select custid, MAX(trans_dt) OVER (PARTITION BY custid) as max_trans_dt, MAX(items) OVER (PARTITION BY custid) as total,
ROW_NUMBER() OVER (PARTITION BY custid order by trans_dt desc, items desc) as rn ) tmp
WHERE tmp.rn = 1

Есть ли более разумное и чистое решение для вышеуказанного требования?Спасибо

1 Ответ

0 голосов
/ 11 июня 2019

Просто используйте условное агрегирование:

select cust_id
       max(case when trans_dt is not null then items else 0 end) as max_items
from t
group by cust_id;
...