본문 바로가기

전산Tip/Oracle

한방 쿼리 Tip

반응형
Q.

안녕하세요..
고수님의 고견을 부탁드립니다..

select * from Table;

No Date Time
1 20080610 072642
2 20080610 101742
3 20080610 105318
4 20080610 132434
5 20080610 135402
6 20080610 143559
7 20080610 161925
8 20080610 161926
9 20080610 165505
10 null null
11 null null
12 null null
13 20080610 200400

이런식으로 데이터가 들어있다고 가정할 때..(null인 로우가 1~n개 일수 있음)

null인 로우를 가상의 데이터(일자,시간)로 채우고 싶습니다..
예로 일자는 바로 위의 로우와 같은 날자, 시간의 바로 위의 로우 + 1초로
select 하고 싶은데..
될듯 될듯 안 되네요..

9 20080610 165505
10 20080610 165506
11 20080610 165507
12 20080610 165508
13 20080610 200400

A.

WITH t AS
(
SELECT 1 no, '20080610' Dt, '072642' Tm FROM dual
UNION ALL SELECT 2, '20080610', '101742' FROM dual
UNION ALL SELECT 3, '20080610', '105318' FROM dual
UNION ALL SELECT 4, '20080610', '132434' FROM dual
UNION ALL SELECT 5, '20080610', '135402' FROM dual
UNION ALL SELECT 6, '20080610', '143559' FROM dual
UNION ALL SELECT 7, '20080610', '161925' FROM dual
UNION ALL SELECT 8, '20080610', '161926' FROM dual
UNION ALL SELECT 9, '20080610', '165505' FROM dual
UNION ALL SELECT 10, null , null FROM dual
UNION ALL SELECT 11, null , null FROM dual
UNION ALL SELECT 12, null , null FROM dual
UNION ALL SELECT 13, '20080610', '200400' FROM dual
)
SELECT no
, TO_CHAR(dt_tm,'yyyymmdd') dt
, TO_CHAR(dt_tm,'hh24miss') tm
FROM (SELECT no
, TO_DATE(MIN(dt) OVER(PARTITION BY gb)
|| MIN(tm) OVER(PARTITION BY gb)
, 'yyyymmddhh24miss')
+ (ROW_NUMBER() OVER(PARTITION BY gb ORDER BY no) - 1)/24/60/60
AS dt_tm
FROM (SELECT no, dt, tm
, COUNT(Dt) OVER(ORDER BY no) gb
FROM t)
)
;



'전산Tip > Oracle' 카테고리의 다른 글

오라클 데이터 타입  (0) 2008.09.21
대용량 Sam 파일 오라클에 Load하기  (1) 2008.09.21
Oracle SQL*Loader  (0) 2008.09.21