쿼리질문 - 빈 cell 값을 과거 데이터로 채우고자 할 때 (oracle) 1 4 715

by 둥둥맨 [SQL Query] [2020.07.03 11:42:30]


안녕하세요, 지난 번 답변 주심에 다시한번 감사드립니다.

새로운 쿼리 질문 드립니다. 빈 cell 값을 과거 데이터로 채우고자 할 때 인데요, 테이블은 다음과 같습니다.

base_ymd seq key_id id1 id2
20200601 1 12345 AAA ZZZ
20200602 1 12345   ZZZ
20200603 1 12345 BBB ZZZ
20200603 2 12345   ZZZ
20200604 1 12345 CCC ZZZ
20200605 1 12345 CCC  
20200601 1 54321 YYY XXX
202006     ... ...

key_id가 여러개 있는 테이블에, id1과 id2가 비어있는 경우가 존재합니다.

base_ymd와 seq 기준으로 과거데이터(seq는 작을 수록 과거)에 값이 존재한다는 전제 하에 다음 값이 null이면(2번째, 4번째 id1)

과거 id1값을 가지고 채우는 로직이 필요합니다. null은 2개 이상일 수도 있고, id2도 마찬가지입니다.

 미리 감사드립니다.

by 랑에1 [2020.07.03 12:41:18]
WITH T(base_ymd, seq, key_id, id1, id2) AS (
	SELECT '20200601', 1, 12345, 'AAA', 'ZZZ' FROM dual UNION ALL
	SELECT '20200602', 1, 12345, '', 'ZZZ' FROM dual UNION ALL 
	SELECT '20200603', 1, 12345, 'BBB', 'ZZZ' FROM dual UNION ALL 
	SELECT '20200603', 2, 12345, '', 'ZZZ' FROM dual UNION ALL 
	SELECT '20200604', 1, 12345, 'CCC', 'ZZZ' FROM dual UNION ALL 
	SELECT '20200605', 1, 12345, 'CCC', '' FROM dual UNION ALL 
	SELECT '20200601', 1, 54321, 'YYY', 'XXX' FROM dual
)

SELECT base_ymd, seq, key_id
     , LAST_VALUE(id1 ignore nulls) OVER(PARTITION BY key_id ORDER BY base_ymd, seq) AS id1
     , LAST_VALUE(id2 ignore nulls) OVER(PARTITION BY key_id ORDER BY base_ymd, seq) AS id2
FROM T

 


by 둥둥맨 [2020.07.03 14:16:37]

빠른 댓글과 도움에 감탄하고 갑니다. 감사합니다!


by 마농 [2020.07.06 16:08:29]

, LAST_VALUE(id1 IGNORE NULLS) OVER(...   --> 10G 문법 : 하위버전 호환성을 위해 상위 버전에서도 사용 가능.
, LAST_VALUE(id1) IGNORE NULLS OVER(...   --> 11G 문법 : ANSI 표준을 따르기 위해 구문을 괄호 밖으로 빼냄


by 둥둥맨 [2020.07.07 13:12:33]

알려주셔서 고맙습니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입