SELECT
TO_CHAR(CTIME, 'HH24:MI') AS CTIME
, AVG(A_COLUMN) AS A_AVG
, AVG(B_COLUMN) AS B_AVG
, AVG(C_COLUMN) AS C_AVG
FROM TBL_LOG T1
WHERE T1.SOME_COLUMN = ?
AND CTIME BETWEEN TO_DATE('20110920000000', 'YYYYMMDDHH24MISS') AND TO_DATE('20110920235959', 'YYYYMMDDHH24MISS')
GROUP BY TO_CHAR(CTIME, 'HH24:MI')
ORDER BY CTIME
;
TBL_LOG 테이블에 특정시간 범위 안에 1분단위로 값이
A_COLUMN, B_COLUMN, C_COLUMN 컬럼 에 인설트 됩니다. CTIME 컬럼은 입력되서 끝나는 시간입니다.
예를 들어 13:28 부터 15:38 분까지 데이터가 들어온다면 13:12 부터 15:38 까지 정상적으로 평균을 구해서 셀렉트 됩니다. 즉, 시간대에 따라 결과 row 가 계속 바뀝니다.
----------------------------------------------------------------------------------------------------
CTIME A_AVG b_AVG C_AVG
----------------------------------------------------------------------------------------------------
13:28 1 2 3
13:29 2 2 4
13:30 3 4 5
. . . .
. . . .
. . . .
. . . .
15:37 7 3 2
15:38 6 6 2
result 130 row
전 무조건 00:00 ~ 23:59 즉 1440 row 결과를 도출하고 값이 안들어오는 시간대에는
A_COLUMN, B_COLUMN, C_COLUMN 에 0 값을 넣어서 결과를 내고 싶습니다.
----------------------------------------------------------------------------------------------------
CTIME A_AVG b_AVG C_AVG
----------------------------------------------------------------------------------------------------
00:00 0 0 0
00:01 0 0 0
00:02 0 0 0
. . . .
. . . .
. . . .
. . . .
13:28 1 2 3
13:29 2 2 4
13:30 3 4 5
. . . .
. . . .
. . . .
. . . .
15:37 7 3 2
15:38 6 6 2
. . . .
. . . .
. . . .
. . . .
23:58 0 0 0
23:59 0 0 0
result 1440 row
DUAL 테이블을 사용해서 하루를 1440 단위로 쪼개서 조인을 하는 방법등을 생각해봤으나 실패해서 질문 올립니다.
고수님들 도와주십시요.