24시간 데이터를 30분단위로 집계하는 SQL을 만들려고 합니다. 0 5 17,442

by 이승언(폴리) [SQL Query] [2013.09.13 11:41:34]


24시간 데이터를 30분단위로 집계하는 SQL을 만들려고 합니다.
'YYYYMMDDHH24MISS'로 이루어진 컬럼을 30분 단위로 group by 해야 합니다.
딱히 좋은 방법이 떠오르지가 않아서요.
고견 부탁드립니다.
by 우리집아찌 [2013.09.13 12:07:44]
 
-- 무식하게..
WITH T ( DT ) AS (
SELECT TO_DATE('20130913122801' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913123801' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913131801' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913135801' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913140101' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913140301' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913144101' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913144801' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913152011' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913152801' , 'YYYYMMDDHH24MISS' ) FROM DUAL UNION ALL
SELECT TO_DATE('20130913152801' , 'YYYYMMDDHH24MISS' ) FROM DUAL 
)
SELECT DD , COUNT(*) FROM
(SELECT TO_CHAR(DT,'YYYYMMDDHH24') || DECODE(SIGN(TO_CHAR(DT,'MI')-30),-1,'A','B') DD FROM T)
GROUP BY DD

by 마농 [2013.09.13 12:24:20]
1. Date Type 인 경우
 GROUP BY TO_CHAR(dt, 'yyyymmddhh24'), FLOOR(TO_CHAR(dt, 'mi') / 30)
2. Varchar2(14) 인 경우
 GROUP BY SUBSTR(dt, 1, 12), FLOOR(SUBSTR(dt, 13, 2) / 30)

by 이승언(폴리) [2013.09.13 12:53:33]
저의 어설픈 질문에 답변하여주신 2분께 정말 감사를 드리구요.
우리집아찌님과 마농님의 답변에 힌트를 얻어서 
GROUP BY SUBSTR(DT, 1, 10)||DECODE(FLOOR(SUBSTR(DT, 11, 2) / 30), 0, '00', 1, '30')
를 작성하니 자 되는 군요.
감사합니다.

by 마농 [2013.09.13 13:08:27]
아..자리수를 잘못 잘랐네요 
 GROUP BY SUBSTR(dt, 1, 10) || LPAD(FLOOR(SUBSTR(dt, 11, 2) / 30) * 30, 2, '0')

by 야신 [2013.09.14 12:18:33]
Floor(To_date(컬럼)/24/2 ) 이렇게 그룹바이 하면 되지 않을까요?
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입