2017-09-26 3 views
1

증분 업데이트를받는 다음 표가 있습니다. 가장 최근의 값을 가진 동일한 키 값을 가진 행을 병합하려면 일반적인 하이브 쿼리를 작성해야합니다.하이브 테이블에 중복 레코드 병합

Key | A | B | C | Timestamp 
K1 | X | Null | Null | 2015-05-03 
K1 | Null | Y | Z | 2015-05-02 
K1 | Foo | Bar | Baz | 2015-05-01 

얻을 싶어 :

Key | A | B | C | Timestamp 
K1 | X | Y | Z | 2015-05-03 
+0

먼저 생각 - 유착,하지만 난 열이 덜 다시 CTE 호출을 지원하지 않습니다 하이브로 시도 할 수있는 경우 그 –

+0

올바른 생각하지 않습니다 새로운 CTE를 만들려면 새로운 테이블을 만들거나 스토리지를 정리해야합니다. –

답변

0

사용 FIRST_VALUE() 함수를 null이 아닌 값을 지속 얻을. last_value는 하나의 정렬 키에서만 작동하기 때문에 정렬 키를 연결해야합니다.

데모 :

select distinct 
key, 
first_value(A) over (partition by Key order by concat(case when A is null then '1' else '2' end,'_',Timestamp)desc) A, 
first_value(B) over (partition by Key order by concat(case when B is null then '1' else '2' end,'_',Timestamp)desc) B, 
first_value(C) over (partition by Key order by concat(case when C is null then '1' else '2' end,'_',Timestamp)desc) C, 
max(timestamp) over(partition by key) timestamp 
from 
( ---------Replace this subquery with your table 
select 'K1' key, 'X' a, Null b, Null c, '2015-05-03' timestamp union all 
select 'K1' key, null a, 'Y'  b, 'Z' c, '2015-05-02' timestamp union all 
select 'K1' key, 'Foo' a, 'Bar' b, 'Baz' c, '2015-05-01' timestamp 
)s 
; 

출력 :

OK 
key  a  b  c  timestamp 
K1  X  Y  Z  2015-05-03