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 41732 게시물 읽기
No. 41732
구분자별 시작일 종료일을 구하는 sql 조언 부탁드립니다.
작성자
개발자
작성일
2019-06-18 13:48ⓒ
2019-06-18 14:37ⓜ
조회수
2,427

[원본데이터]

pk gubun std edt
1 사과     20100101 20101231
1 사과     20110101 20111231
1 사과     20120101 20121231
1 배     20130101 20131231
1 배     20140101 20141231
1 사과     20150101 20151231
1 사과     20160101 20161231
2 사과     20100101 20131231
2 사과     20140101 20141231
2 배     20150101 20161231

 


* pk별 구분이 바뀌는 구간에 시작일 ~ 종료일을 구하고자 합니다.

* pk별 일자의 중복구간은 없습니다.

* pk별 구분값은 중복되어 나올수 있으며 바로 이어지지 않는경우 별도의 시작일 ~ 종료일로 인식되게 하려고 합니다.


 

[결과 데이터]

pk gubun std edt
1 사과     20100101 20121231
1 배     20130101 20141231
1 사과     20150101 20161231
2 사과     20100101 20141231
2 배     20150101 20161231

 

[샘플데이터]

WITH T AS

(

SELECT '1' pk, '사과' gubun, '20100101' sdt, '20101231' edt FROM DUAL UNION ALL

SELECT '1' pk, '사과' gubun, '20110101' sdt, '20111231' edt FROM DUAL UNION ALL

SELECT '1' pk, '사과' gubun, '20120101' sdt, '20121231' edt FROM DUAL UNION ALL

SELECT '1' pk, '배' gubun, '20130101' sdt, '20131231' edt FROM DUAL UNION ALL

SELECT '1' pk, '배' gubun, '20140101' sdt, '20141231' edt FROM DUAL UNION ALL

SELECT '1' pk, '사과' gubun, '20150101' sdt, '20151231' edt FROM DUAL UNION ALL

SELECT '1' pk, '사과' gubun, '20160101' sdt, '20161231' edt FROM DUAL UNION ALL

SELECT '2' pk, '사과' gubun, '20100101' sdt, '20131231' edt FROM DUAL UNION ALL

SELECT '2' pk, '사과' gubun, '20140101' sdt, '20141231' edt FROM DUAL UNION ALL

SELECT '2' pk, '배' gubun, '20150101' sdt, '20161231' edt FROM DUAL

)

SELECT *

FROM   T

 

 

 

 

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

1. 기간은 항상 년 단위(1/1~12/31)인가요? 아니면 자유롭게 입력 가능한가요?
2. 기간은 항상 끊김이 없나요? 아니면 중간에 끊길 수도 있나요?
제시하신 예는 년단위 연속 기간만 있네요.

마농(manon94)님이 2019-06-18 18:41에 작성한 댓글입니다.
이 댓글은 2019-06-18 18:52에 마지막으로 수정되었습니다.

 안녕하세요 마농님..

1. 기간은 항산 년단위는 아닙니다. (보기 편하게 하려고..)

2. 기간은 끊김이 없습니다. (원본 데이터 자체가 시작일만 있는 데이터에 다음 시작일 -1 로 가공한 데이터라 끊김은 없습니다 )

개발자님이 2019-06-19 10:40에 작성한 댓글입니다. Edit

SELECT pk, gubun
     , MIN(sdt) sdt
     , MAX(edt) edt
  FROM (SELECT pk, gubun, sdt, edt
             , ROW_NUMBER() OVER(PARTITION BY pk        ORDER BY sdt)
             - ROW_NUMBER() OVER(PARTITION BY pk, gubun ORDER BY sdt) grp
          FROM t
        )
 GROUP BY pk, gubun, grp
 ORDER BY pk, sdt
;

마농(manon94)님이 2019-06-19 11:17에 작성한 댓글입니다.

마농님.. 너무 감사드립니다.

sql 보면서 감탄합니다.  ( - 하는 부분에서 무릅 탁...)

잘 저장해서 두고 두고 사용 하겠습니다.

개발자님이 2019-06-19 11:30에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
41736ORACLE 적재속도문제 [1]
DB
2019-06-25
2271
41735컬럼명과 테이블명을 어디서 정의해주나요? [2]
신승익
2019-06-21
2196
41733gv$session 에서 sql_id가 null 인애들 찾기
나경민
2019-06-19
2091
41732구분자별 시작일 종료일을 구하는 sql 조언 부탁드립니다. [4]
개발자
2019-06-18
2427
41730오라클 테이블 스키마 백업시.. [1]
권기혁
2019-06-18
2496
41729Pro*C 관련 에러 [PCC-S-02338, structure contains a nested struct or union]
WalkeR
2019-06-14
2247
41728기초sql 구문 질문 [5]
공시생
2019-06-14
3058
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.052초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다