중간에 비워 있는 날짜 및 시간 채워 넣는 쿼리.?? 0 6 966

by 맛동산 [SQL Query] [2018.06.07 16:14:32]


안녕하세요 

테이블에 이렇게 데이터가 들어가져 있습니다. 

날짜 사용자 토탈 사용중
201802150002 ABC 10 2
201802150050 ABC 10 9
201802150200 ABC 10 7
201802150400 ABC 10 6
201802150517 ABC 10 0

201802150003 ABC 10 2 

201802150006 ABC 10 2 

201802150009 ABC 10 2 

           :          :     :   :

201802150048 ABC 10 2

201802150051 ABC 10 9  

           :          :     :   :

이거 쿼리로도 가능한지 알고 싶습니다. 혹시 아시는분 있으시면 힌트라도 주시면 감사하겠습니다. 

by 마농 [2018.06.07 16:30:36]

조회 기준이 어떻게 되나요?
1. 특정사용자?/전체사용자?
2. 특정기간?/전체기간?
3. 사용자별 시작시간이 다르게 나와야 하는지?( abc 는 00:02 에 시작이므로 00:03 부터 조회됨)


by 아발란체 [2018.06.07 16:44:37]

와... 어렵다.. @.@)/


by 마농 [2018.06.07 18:13:09]

1. a 를 원하지만 b 를 해도 된다.
  - 쿼리가 전혀 달라질 수 있습니다.
  - 명확하게 최종 원하시는 걸 표현하시는 게 좋습니다.
2. 해당 조회 기간이 2월달 이라면?
  - abc 는 왜 201802150003 으로 시작하나요?
  - 201802010000 부터 시작해서 201802282357 로 끝나야 하는 것 아닌가요?


by 맛동산 [2018.06.07 18:16:44]

1. 전체 사용자 입니다.

2. 너무 길어 일부만 적어 놓은 것입니다.^^


by 마농 [2018.06.08 07:59:59]
WITH t AS
(
SELECT '201802150002' dt, 'ABC' id, 10 tot, 2 use FROM dual
UNION ALL SELECT '201802150050', 'ABC', 10, 9 FROM dual
UNION ALL SELECT '201802150200', 'ABC', 10, 7 FROM dual
UNION ALL SELECT '201802150400', 'ABC', 10, 6 FROM dual
UNION ALL SELECT '201802150517', 'ABC', 10, 0 FROM dual
)
SELECT id
     , dt
     , tot
     , use
  FROM (SELECT a.lv
             , b.id
             , a.dt
             , LAST_VALUE(b.tot) IGNORE NULLS OVER(PARTITION BY b.id ORDER BY a.dt) tot
             , LAST_VALUE(b.use) IGNORE NULLS OVER(PARTITION BY b.id ORDER BY a.dt) use
          FROM (-- 조회기간 분단위 생성 --
                SELECT LEVEL lv
                     , TO_CHAR(sdt + (LEVEL-1)/24/60, 'yyyymmddhh24mi') dt
                  FROM (SELECT TO_DATE('20180215', 'yyyymmdd') sdt -- 시작일
                             , TO_DATE('20180215', 'yyyymmdd') edt -- 종료일
                          FROM dual
                        )
                 CONNECT BY LEVEL <= (edt - sdt + 1) * 24*60
                ) a
          LEFT OUTER JOIN t b
          PARTITION BY (b.id)
            ON a.dt = b.dt
        )
 WHERE MOD(lv, 3) = 1  -- 3분 단위만 추출
 ORDER BY id, dt
;

 


by 맛동산 [2018.06.08 09:15:55]

정말 감사합니다~^^

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