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 40560 게시물 읽기
No. 40560
기간내 해당하는 데이타 추출하기
작성자
너구리
작성일
2014-08-22 14:33
조회수
8,639

아래와 같이 시작일, 종료일이 마구잡이로 비율이 들어 오는 로그테이블이 있습니다.

이중 마지막에 들어온 데이타를 기준으로  원하는 기간의 비율을 뽑고자 합니다.

저는 몇일째 고민하고 있는데, 생각보다 쉽지 않네요.

고수님들 조언 부탁드리겠습니다.

 

1. 아래 데이타 구조에서 기간내에 비율을 구하고 싶습니다.

WITH TMP AS (
SELECT 1 AS SEQ, '20131201' AS START_DT, '20140131' AS END_DT, 20 AS RATE FROM DUAL UNION ALL
SELECT 2, '20140101', '20140131', 30 FROM DUAL UNION ALL
SELECT 3, '20140101', '20140228', 20 FROM DUAL UNION ALL
SELECT 4, '20131201', '20140115', 40 FROM DUAL
) SELECT * FROM TMP;

SEQ 시작일 종료일 비율
1 20131201 20140131 20
2 20140101 20140131 30
3 20140101 20140228 20
4 20131201 20140115 40

 원하는 결과는 아래와 같습니다.

- 기간이 겹칠시에는 SEQ가 큰게 우선입니다.

- 20140101 ~ 20140131의 데이타를 구할 경우에는

SEQ 시작일 종료일 비율
4 20140101 20140115 40
3 20140116 20140131 20

 

 

2. 아래 데이타 구조에서 기간내에 비율을 구하고 싶습니다.

WITH TMP AS (
    SELECT 1 AS SEQ, '20131201' AS START_DT, '20140131' AS END_DT, 20 AS RATE FROM DUAL UNION ALL
    SELECT 2, '20140101', '20140131', 30 FROM DUAL UNION ALL
    SELECT 3, '20140101', '20140228', 20 FROM DUAL UNION ALL
    SELECT 4, '20131201', '20140115', 40 FROM DUAL UNION ALL
    SELECT 5, '20131201', '20140115', 15 FROM DUAL UNION ALL
    SELECT 6, '20140111', '20140120', 25 FROM DUAL UNION ALL
    SELECT 7, '20140116', '20140228', 30 FROM DUAL
   
) SELECT * FROM TMP;

SEQ 시작일 종료일 비율
1 20131201 20140131 20
2 20140101 20140131 30
3 20140101 20140228 20
4 20131201 20140115 40
5 20131201 20140115 15
6 20140111 20140120 25
7 20140116 20140228 30

 

원하는 결과는 아래와 같습니다.

- 기간이 겹칠시에는 SEQ가 큰게 우선입니다.

- 20140101 ~ 20140131의 데이타를 구할 경우에는

SEQ 시작일 종료일 비율
5 20140101 20140110 15
6 20140111 20140115 25
7 20140116 20140131 30

 

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

WITH tmp AS
(
SELECT 1 seq, '20131201' start_dt, '20140131' end_dt, 20 rate FROM dual
UNION ALL SELECT 2, '20140101', '20140131', 30 FROM dual
UNION ALL SELECT 3, '20140101', '20140228', 20 FROM dual
UNION ALL SELECT 4, '20131201', '20140115', 40 FROM dual
)
, cal AS
(
SELECT LEVEL lv
     , TO_CHAR(sdt + LEVEL - 1, 'yyyymmdd') dt
  FROM (SELECT TO_DATE('20140101', 'yyyymmdd') sdt
             , TO_DATE('20140131', 'yyyymmdd') edt
          FROM dual)
 CONNECT BY LEVEL <= edt - sdt + 1
)
SELECT seq
     , MIN(dt) sdt
     , MAX(dt) edt
     , rate
  FROM (SELECT dt
             , MAX(seq) seq
             , MAX(rate) KEEP(DENSE_RANK LAST ORDER BY seq) rate
             , lv
             , ROW_NUMBER() OVER(PARTITION BY MAX(seq) ORDER BY dt) rn
          FROM tmp t
             , cal c
         WHERE dt BETWEEN start_dt AND end_dt
         GROUP BY dt, lv
        )
 GROUP BY seq, rate, lv-rn
 ORDER BY sdt
;

마농(manon94)님이 2014-08-22 17:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40564SQL 데이터 조회시 질문이있습니다... [1]
신동열
2014-08-28
7709
40563쿼리 질문 드립니다. [1]
야간비행
2014-08-26
7843
40561대용량 xml구조 데이타 insert select [1]
json
2014-08-22
9686
40560기간내 해당하는 데이타 추출하기 [1]
너구리
2014-08-22
8639
40559프로시져 속도 향상 문의 드립니다. [5]
야간비행
2014-08-20
9011
40558합격자 선발 SQL 작성 방법? [4]
김기석
2014-08-18
8552
40555쿼리 문의(세로를 가로로...) [1]
박지연
2014-08-11
8873
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.027초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다