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 41992 게시물 읽기
No. 41992
1년이상 연속된 일자 가져오기 관련 질문입니다.
작성자
조기영
작성일
2024-06-07 09:40
조회수
68

안녕하세요~ 

다름이 아니라, 여러개의 상품을 매입 하고자 할때 각 상품구매한 일자가 연속으로 1년이상인 경우를 뽑고 싶습니다.(상품을 여러개 살수 있습니다.)

=================================================

상품명    상품매입일     상품매도일

A           20230101       20231031

A           20230930       20240305   <-- 위의 건과 합쳐서 1년이 넘어서 해당 상품은 나와야 합니다.

B           20230201       20231031

B           20231201       20240430

B           20230304       20230930      <-- 중간에 끊겨서 미인정

C           20230101       20230630

C           20230530       20231030

C           20230901       20231231     <-- 3갠이 1년이상 넘어서 해당 상품은 나와야 합니다.

=================================

한방 쿼리로 가능할가요?  조언 부탁드립니다.  

이 글에 대한 댓글이 총 2건 있습니다.
WITH t AS
(
SELECT 'A' cd, '20230101' sdt, '20231031' edt FROM dual
UNION ALL SELECT 'A', '20230930', '20240305' FROM dual
UNION ALL SELECT 'B', '20230201', '20231031' FROM dual
UNION ALL SELECT 'B', '20231201', '20240430' FROM dual
UNION ALL SELECT 'B', '20230304', '20230930' FROM dual
UNION ALL SELECT 'C', '20230101', '20230630' FROM dual
UNION ALL SELECT 'C', '20230530', '20231030' FROM dual
UNION ALL SELECT 'C', '20230901', '20231231' FROM dual
)
SELECT cd
     , MIN(sdt) sdt
     , MAX(edt) edt
     , TRUNC(MONTHS_BETWEEN(MAX(edt) + 1, MIN(sdt)), 2) mm
  FROM (SELECT cd, sdt, edt
             , SUM(flag) OVER(PARTITION BY cd ORDER BY sdt, edt) grp
          FROM (SELECT cd
                     , TO_DATE(sdt, 'yyyymmdd') sdt
                     , TO_DATE(edt, 'yyyymmdd') edt
                     , CASE
                       WHEN MAX(edt) OVER(PARTITION BY cd ORDER BY sdt, edt
                            ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
                         >= TO_CHAR(TO_DATE(sdt, 'yyyymmdd') - 1, 'yyyymmdd')
                       THEN 0 ELSE 1 END flag
                  FROM t
                )
        )
 GROUP BY cd, grp
HAVING MONTHS_BETWEEN(MAX(edt) + 1, MIN(sdt)) >= 12
;

 
마농(manon94)님이 2024-06-07 11:32에 작성한 댓글입니다.

감사합니다. 마농님

조기영님이 2024-06-07 17:16에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
41996인덱스 사용 후 Cost 값 증가 [1]
테사자
2024-06-25
25
41993쿼리수행시간 문의 [1]
열심히하자
2024-06-18
55
419921년이상 연속된 일자 가져오기 관련 질문입니다. [2]
조기영
2024-06-07
68
41991회사에서도 사용할 수 있는 오라클 프리웨어 GUI 툴 문의 드립니다. [1]
푸른나무
2024-06-04
86
41990MSSQL에서 오라클로 메타변환하는 방법문의드립니다. [1]
새내기
2024-05-23
107
41989대용량 데이터 group by, order by desc 조언 구합니다.
DB초보
2024-05-14
153
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다