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 41171 게시물 읽기
No. 41171
종료일을 구하는 쿼리문의 드립니다.
작성자
IT재벌(IT재벌)
작성일
2016-06-10 10:55
조회수
7,849

성명 시작일 종료일

홍길동 2016-04-01

홍길동 2016-01-01

홍길동 2015-07-01

홍길동 2015-01-01

홍길동 2014-01-01

홍길동 2013-01-01

홍길동 2012-01-01

 

 

위와 같은 데이터가 있는 경우 종료일을 구하고 싶습니다.

정렬은 시작일 desc로 구성되어있습니다.

 

1번째 row의 종료일은 '9999-12-31'이고

2번째 row부터 마지막 row의 종료일은 상위 row의 시작일 - 1일 입니다.

 

즉, 아래와 같은 결과가 나왔으면 합니다.

성명 시작일 종료일

홍길동 2016-04-01 9999-12-31

홍길동 2016-01-01 2016-03-31

홍길동 2015-07-01 2015-12-31

홍길동 2015-01-01 2015-06-30

홍길동 2014-01-01 2014-12-31

홍길동 2013-01-01 2013-12-31

홍길동 2012-01-01 2012-12-31

 

rownum과 level을 쓰려고 하였는데, 쉽지 않네요..

 

답변 기다리겠습니다.

감사합니다.

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

ROW_NUMBER 로 순번 채번하여

해당 순번 토대로 JOIN 해서 데이터 뽑으시면 됩니다.

하기는 MSSQL 로 작성된 쿼리이며

오라클에 맞게 수정해서 쓰시면 될듯하네요.

 

---쿼리시작---

;With tblA(성명,시작일) As
(
      Select '홍길동','2016-04-01' Union All
      Select '홍길동','2016-01-01' Union All
      Select '홍길동','2015-07-01' Union All
      Select '홍길동','2015-01-01' Union All
      Select '홍길동','2014-01-01' Union All
      Select '홍길동','2013-01-01' Union All
      Select '홍길동','2012-01-01'
)
,tblB(성명,시작일,seq) As
(
      Select a.*
            ,Row_Number() Over(Order By a.시작일 Desc)
        From tblA a      
)
      Select a.성명
            ,a.시작일
            ,(
                 Case When a.seq = 1
                         Then '9999-12-31'
                      Else Convert(char(10),DATEADD(DAY,-1,b.시작일),121)
                 End
             )    As 종료일
        From tblB a
                    Left Outer Join
                                    tblB b
                                           On a.seq -1 = b.seq
    Order By a.seq Asc
---쿼리끝---   

최한영(terry0515)님이 2016-06-13 11:24에 작성한 댓글입니다.

감사합니다.

많은 도움이 되었습니다.

IT재벌(IT재벌)님이 2016-06-13 19:23에 작성한 댓글입니다.

SELECT nm
     , sdt
     , NVL(TO_CHAR(TO_DATE(
       LAG(sdt) OVER(PARTITION BY nm ORDER BY sdt DESC)
       , 'yyyy-mm-dd') - 1, 'yyyy-mm-dd'), '9999-12-31') AS edt
  FROM t
;

마농(manon94)님이 2016-06-17 15:48에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41174부모키가 없다고하고 기본키가 두개일경우
이기쁨
2016-06-14
7505
41173질문이요! [1]
질문
2016-06-14
7362
41172톰캣 + 오라클 DB 연동 운영시 문제가 있습니다.
유혼
2016-06-12
7232
41171종료일을 구하는 쿼리문의 드립니다. [3]
IT재벌
2016-06-10
7849
41170백업 관련 문의드립니다. (백업명령어 질문)
김삼
2016-06-02
7307
41169UDF 함수로 외부 C 라이브러리 호출 하는 것에 대해서..
초보DBA
2016-06-02
8087
41167dbms_crypto.hash(to_clob( + quatation 따옴표 사용 문의 [3]
박재덕
2016-06-01
7676
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다