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 40429 게시물 읽기
No. 40429
[질문] 순차적으로 가로로 데이터를 추출한는 query 문의 드립니다.
작성자
안동석
작성일
2014-04-14 09:45
조회수
7,992

t1 table
a column
1
2
4
5
8
t2 table
b column
1
3
6

결과
1 1
2 3
4
5 6
8

즉 t1 의 a column 과 크거나 같을경우 우측으로 배열 새우는 내용입니다.

감사합니다.
       
 

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

SELECT t1.a

,( SELECT MIN(t2.b) FROM t2 WHERE t2.b >= t1.a)

  FROM t1 

 

착한넘(agoodman99)님이 2014-04-14 09:58에 작성한 댓글입니다.

b 에 7 이 추가될 경우 결과가 어떻게 나와야 할까요?

또 a 에 1이 빠질 경우 결과가 어떻게 나와야 할까요?

마농(manon94)님이 2014-04-14 10:58에 작성한 댓글입니다.
이 댓글은 2014-04-14 11:04에 마지막으로 수정되었습니다.

b1에 7이 추가되는 경우의 수는 없습니다.

a에 1이 빠지는 경우도 없습니다.

 

a테이블에 기준이 반드시 하나이고  b는 a와 동일하거나 큽니다. 

즉 a의 수보다 크거나 같은 b가 존재합니다. 

단 b가 두개일수는 없습니다. 죽 a가 4,7이면 b는  5와 6이 동시에 올수 없습니다

 Key INPUT_YMD INPUT_HMS
A 20140411 123601
A 20140411 123611
A 20140411 123621

B 20140411 123711
B 20140411 123721

C 20140411 122302
C 20140411 122312
C 20140411 122322

 

Key FROM_YMD FROM_HMS TO_YMD         TO_HMS
A 20140411 123601          20140411 123601
A 20140411 123622          20140411 123628

B 20140411 123712          20140411 123718

C 20140411 122302          20140411 122307
C 20140411 122323          20140411 122329


KEY INPUT_YMD INPUT_HMS FROM_YMD FROM_HMS TO_YMD         TO_HMS
A 20140411 123601         20140411 123601         20140411 123601
A 20140411 123611         
A 20140411 123621         20140411 123622         20140411 123628

B 20140411 123711         20140411 123712         20140411 123718
B 20140411 123721         

C 20140411 122302         20140411 122302         20140411 122307
C 20140411 122312         
C 20140411 122322         20140411 122323         20140411 122329

 

인 경우만 존재합니다.

안동석님이 2014-04-14 11:15에 작성한 댓글입니다.
이 댓글은 2014-04-14 11:21에 마지막으로 수정되었습니다. Edit

WITH t1 (key, input_ymd, input_hms) AS
(         SELECT 'A', '20140411', '123601' FROM dual
UNION ALL SELECT 'A', '20140411', '123611' FROM dual
UNION ALL SELECT 'A', '20140411', '123621' FROM dual
UNION ALL SELECT 'B', '20140411', '123711' FROM dual
UNION ALL SELECT 'B', '20140411', '123721' FROM dual
UNION ALL SELECT 'C', '20140411', '122302' FROM dual
UNION ALL SELECT 'C', '20140411', '122312' FROM dual
UNION ALL SELECT 'C', '20140411', '122322' FROM dual
)
, t2 (key, from_ymd, from_hms, to_ymd, to_hms) AS
(         SELECT 'A', '20140411', '123601', '20140411', '123601' FROM dual
UNION ALL SELECT 'A', '20140411', '123622', '20140411', '123628' FROM dual
UNION ALL SELECT 'B', '20140411', '123712', '20140411', '123718' FROM dual
UNION ALL SELECT 'C', '20140411', '122302', '20140411', '122307' FROM dual
UNION ALL SELECT 'C', '20140411', '122323', '20140411', '122329' FROM dual
)
SELECT a.key
     , a.input_ymd, a.input_hms
     , b.from_ymd, b.from_hms
     , b.to_ymd, b.to_hms
  FROM (SELECT key, input_ymd, input_hms
             , input_ymd || input_hms stm
             , LEAD(input_ymd || input_hms, 1, '99991231235959')
               OVER(PARTITION BY key ORDER BY input_ymd, input_hms) etm
          FROM t1
        ) a
     , t2 b
 WHERE a.key = b.key(+)
   AND b.from_ymd(+) || b.from_hms(+) >= a.stm
   AND b.from_ymd(+) || b.from_hms(+) <  a.etm
 ORDER BY a.key
     , a.input_ymd, a.input_hms
     , b.from_ymd, b.from_hms
;

마농(manon94)님이 2014-04-14 13:16에 작성한 댓글입니다.

b2에 7이 있는 경우 도 있습니다.

이 경우에는 결과가 이렇게 나와야 합니다....
1 1
2 3
4
5 6

5 7
8

안동석님이 2014-04-14 16:05에 작성한 댓글입니다. Edit

t1
Key INPUT_YMD INPUT_HMS
A 20140411 123601
A 20140411 123611
A 20140411 123621

B 20140411 123711
B 20140411 123721

C 20140411 122302
C 20140411 122312
C 20140411 122322

 
t2
Key FROM_YMD FROM_HMS TO_YMD         TO_HMS
A 20140411 123601          20140411 123601
A 20140411 123603          20140411 123604
A 20140411 123622          20140411 123628

B 20140411 123712          20140411 123718

C 20140411 122302          20140411 122307
C 20140411 122323          20140411 122329

결과
KEY INPUT_YMD INPUT_HMS FROM_YMD FROM_HMS TO_YMD         TO_HMS
A 20140411 123601         20140411 123601         20140411 123601
A 20140411 123601         20140411 123603         20140411 123604
A 20140411 123611         
A 20140411 123621         20140411 123622         20140411 123628

B 20140411 123711         20140411 123712         20140411 123718
B 20140411 123721        

C 20140411 122302         20140411 122302         20140411 122307
C 20140411 122312         
C 20140411 122322         20140411 122323         20140411 122329

안동석님이 2014-04-14 16:19에 작성한 댓글입니다. Edit

a 에 1 이 없는 경우만 없다면?

b 에 7이 추가되는 경우는 위에 답변드린 쿼리로 커버가 됩니다.

마농(manon94)님이 2014-04-14 16:38에 작성한 댓글입니다.

항상 감사드립니다.

안동석님이 2014-04-14 16:44에 작성한 댓글입니다. Edit

 LEAD(input_ymd || input_hms, 1, '99991231235959')
               OVER(PARTITION BY key ORDER BY input_ymd, input_hms) etm

이 문장을 사용하지 않고 할 수 있는 방법은 없을까요?  간단한 syntax로  한번더 부탁 드립니다.

안동석님이 2014-04-14 16:48에 작성한 댓글입니다. Edit

다음 행의 값을 확인하는 가장 간단한 신텍스 인데요?

분석함수를 사용할 수 없었을 시절에는

셀프조인과 그룹바이를 복잡하게 사용해야만 했었죠.

성능 또한 느렸구요.

마농(manon94)님이 2014-04-14 16:55에 작성한 댓글입니다.

사실은 my sql 사용해야 하는데... 그 쪽은 제가 해본적이 없어서 간단한 sql 명령어만 적용이 가능해서 드린겁니다... 감사합니다.

my  sql에서 데이터를 가지고 와서 oracle로 넣어놓고 처리 해야 할 듯 합니다.

거듭 감사합니ㅏㄷ.

 

안동석님이 2014-04-14 16:57에 작성한 댓글입니다. Edit

SELECT a.key
     , a.input_ymd, a.input_hms
     , b.from_ymd, b.from_hms
     , b.to_ymd, b.to_hms
  FROM (SELECT a.key, a.input_ymd, a.input_hms
             , CONCAT(a.input_ymd, a.input_hms) stm
             , IFNULL(
               MIN(CONCAT(b.input_ymd, b.input_hms))
               , '99991231235959') etm
          FROM t1 a
          LEFT OUTER JOIN t1 b
            ON a.key = b.key
           AND CONCAT(a.input_ymd, a.input_hms)
             < CONCAT(b.input_ymd, b.input_hms)
         GROUP BY a.key, a.input_ymd, a.input_hms
        ) a
  LEFT OUTER JOIN t2 b
    ON a.key = b.key
   AND CONCAT(b.from_ymd, b.from_hms) >= a.stm
   AND CONCAT(b.from_ymd, b.from_hms) <  a.etm
 ORDER BY a.key
     , a.input_ymd, a.input_hms
     , b.from_ymd, b.from_hms
;

마농(manon94)님이 2014-04-14 17:09에 작성한 댓글입니다.

잘 됩니다.....정말 감사합니다..

 

 

안동석님이 2014-04-14 17:15에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
404332개의 서버에 1개의 db일경우 select update 질문
김주환
2014-04-17
6034
40432[ORA-01438]초보자입니다. 도와주세요. [2]
이용훈
2014-04-16
6081
40431오라클 쿼리에 몇가지 의문이 있어 질문 드립니다. 확인 좀 부탁드려요^^;; [2]
김종수
2014-04-16
6983
40429[질문] 순차적으로 가로로 데이터를 추출한는 query 문의 드립니다. [13]
안동석
2014-04-14
7992
40428난이도 있는? 쿼리 질문입니다. [3]
착한넘
2014-04-10
8083
40427ORACLE 연결 Time out 문제 [1]
허양민
2014-04-10
6479
40426오라클 셀렉트쿼리에 관해서 질문있어요 [2]
도토리
2014-04-09
7020
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다