반복되는 구분자별로 기간을 구할려고요 1 4 574

by 미래를봐 [2016.07.22 19:12:31]


일자별로 로그를 시작일과 종료일로 구분하여 쿼리하고 싶은데 방법이 구분이 반복되다 보니 잘 안되어서요.

Q&A 찾아 보고는 있는데 비슷한 질문이 없어서 올려 봅니다.

데이터는 아래와 같습니다.

    일자      구분
2016-07-01  Y
2016-07-02  Y
2016-07-03  N
2016-07-04  Y
2016-07-05  N
2016-07-06  N
2016-07-07  N
2016-07-08  N
2016-07-09  N
2016-07-10  N
2016-07-11  N
2016-07-12  Y
2016-07-13  Y
2016-07-14  Y
2016-07-15  Y
2016-07-16  Y
2016-07-17  Y
 

출력되어야 할 결과는

시작일 종료일 구분
2016-07-01 2016-07-02  Y
2016-07-03 2016-07-03  N
2016-07-04 2016-07-04  Y
2016-07-05 2016-07-11  N
2016-07-12 2016-07-17  Y
by jkson [2016.07.22 19:49:16]
WITH T AS
(
SELECT TO_DATE('2016-07-01','yyyy-mm-dd') DT,  'Y' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-02','yyyy-mm-dd') DT,  'Y' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-03','yyyy-mm-dd') DT,  'N' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-04','yyyy-mm-dd') DT,  'Y' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-05','yyyy-mm-dd') DT,  'N' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-06','yyyy-mm-dd') DT,  'N' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-07','yyyy-mm-dd') DT,  'N' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-08','yyyy-mm-dd') DT,  'N' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-09','yyyy-mm-dd') DT,  'N' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-10','yyyy-mm-dd') DT,  'N' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-11','yyyy-mm-dd') DT,  'N' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-12','yyyy-mm-dd') DT,  'Y' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-13','yyyy-mm-dd') DT,  'Y' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-14','yyyy-mm-dd') DT,  'Y' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-15','yyyy-mm-dd') DT,  'Y' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-16','yyyy-mm-dd') DT,  'Y' FG FROM DUAL UNION ALL
SELECT TO_DATE('2016-07-17','yyyy-mm-dd') DT,  'Y' FG FROM DUAL
)
SELECT MIN(DT) MINDT, MAX(DT) MAXDT, MAX(FG) FG
  FROM (SELECT DT, FG, SUM(DECODE(FG, FG2, 0, 1)) OVER (ORDER BY DT) FG3
          FROM (SELECT DT, FG, LAG(FG) OVER (ORDER BY DT) FG2 FROM T))
GROUP BY FG3
ORDER BY MINDT

 


by 미래를봐 [2016.07.22 20:00:52]
Lag라는 분석함수를 몰랐었네요. 감사합니다.

by 마농 [2016.07.25 08:41:53]
SELECT MIN(dt) sdt
     , MAX(dt) edt
     , fg
     , COUNT(*) cnt
  FROM (SELECT dt, fg FROM t ORDER BY fg, dt)
 GROUP BY fg, dt - ROWNUM
 ORDER BY sdt, fg
;
-- http://www.gurubee.net/lecture/2194

 


by jkson [2016.07.25 08:52:15]

간단하군요-0-

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