database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40451 게시물 읽기
No. 40451
어려운 쿼리 문의
작성자
꿈꾸러기
작성일
2014-05-13 17:07ⓒ
2014-05-27 15:54ⓜ
조회수
7,402

* 데이터

SELECT 1 NO, 'WORK1' GBN, to_date('2014-05-01','YYYY-MM-DD') WORK_DATE FROM dual UNION ALL

SELECT 2 , 'WORK1' , to_date('2014-05-02','YYYY-MM-DD') FROM dual UNION ALL

SELECT 3 , 'ABC' , to_date('2014-05-04','YYYY-MM-DD') FROM dual UNION ALL

SELECT 4 , 'CCC' , to_date('2014-05-06','YYYY-MM-DD') FROM dual UNION ALL

SELECT 5 , 'AEC' , to_date('2014-05-06','YYYY-MM-DD') FROM dual UNION ALL

SELECT 6 , 'WORK1' , to_date('2014-05-07','YYYY-MM-DD') FRO

SELECT 7 , 'CCC' , to_date('2014-05-08','YYYY-MM-DD') FROM dual

 

* 결과(소요일)

3

1

 

* 로직

- 종료일자에서 시작일자를 빼서 구함

- 시작일자 : GBN의 값이 'WORK1'이면 시작일

- 종료일자 : GBN의 값이 'WORK1'의 값이 아님.

 

 

이 글에 대한 댓글이 총 1건 있습니다.

WITH t AS
(
SELECT 1 no, 'WORK1' gbn, TO_DATE('2014-05-01', 'yyyy-mm-dd') work_date FROM dual
UNION ALL SELECT 2, 'WORK1', TO_DATE('2014-05-02', 'yyyy-mm-dd') FROM dual
UNION ALL SELECT 3, 'ABC'  , TO_DATE('2014-05-04', 'yyyy-mm-dd') FROM dual
UNION ALL SELECT 4, 'CCC'  , TO_DATE('2014-05-06', 'yyyy-mm-dd') FROM dual
UNION ALL SELECT 5, 'AEC'  , TO_DATE('2014-05-06', 'yyyy-mm-dd') FROM dual
UNION ALL SELECT 6, 'WORK1', TO_DATE('2014-05-07', 'yyyy-mm-dd') FROM dual
UNION ALL SELECT 7, 'CCC'  , TO_DATE('2014-05-08', 'yyyy-mm-dd') FROM dual
)
SELECT MIN(work_date) work_date_from
     , MAX(work_date) work_date_to
     , MAX(work_date)
     - MIN(work_date) work_date_cnt
  FROM (SELECT no, gbn, work_date
             , SUM(DECODE(gbn, 'WORK1', 1)) OVER(ORDER BY no) grp
          FROM (SELECT no, gbn, work_date
                     , LAG(gbn, 1, 'x') OVER(ORDER BY no) lag_gbn
                  FROM t
                )
         WHERE gbn != lag_gbn
           AND 'WORK1' IN (gbn, lag_gbn)
        )
 GROUP BY grp
 ORDER BY MIN(work_date)
;

 

-- 좀더 간결하게 --
SELECT MIN(work_date) work_date_from
     , MAX(work_date) work_date_to
     , MAX(work_date)
     - MIN(work_date) work_date_cnt
  FROM (SELECT no, gbn, work_date
             , LAG(gbn, 1, 'x') OVER(ORDER BY no) lag_gbn
          FROM t
        )
 WHERE gbn != lag_gbn
   AND 'WORK1' IN (gbn, lag_gbn)
 GROUP BY CEIL(ROWNUM / 2)
 ORDER BY MIN(work_date)
;

마농(manon94)님이 2014-05-13 18:09에 작성한 댓글입니다.
이 댓글은 2014-05-13 18:21에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
40455sql결과 문의드립니다. [1]
궁금
2014-05-14
6867
40453외부테이블에 의한 그룹핑에 대해 문의드립니다. [6]
초보
2014-05-14
6670
40452각 개인에게 순번채번할때 [2]
짠심이
2014-05-13
7340
40451어려운 쿼리 문의 [1]
꿈꾸러기
2014-05-13
7402
40450일련된 번호를 묶는것에 대해 문의드립니다. [2]
초보
2014-05-13
6763
40449우메한 질문 하나드립니다 [1]
물새
2014-05-12
7040
40448데이터수정 여부 어떤 식으로 관리하세요 [1]
율리시스
2014-05-12
6291
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다