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 과 크거나 같을경우 우측으로 배열 새우는 내용입니다.
감사합니다.
SELECT t1.a
,( SELECT MIN(t2.b) FROM t2 WHERE t2.b >= t1.a)
FROM t1
b 에 7 이 추가될 경우 결과가 어떻게 나와야 할까요?
또 a 에 1이 빠질 경우 결과가 어떻게 나와야 할까요?
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
인 경우만 존재합니다.
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 ;
b2에 7이 있는 경우 도 있습니다.
이 경우에는 결과가 이렇게 나와야 합니다.... 1 1 2 3 4 5 6
5 7 8
t1 Key INPUT_YMD INPUT_HMS A 20140411 123601 A 20140411 123611 A 20140411 123621
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
결과 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
a 에 1 이 없는 경우만 없다면?
b 에 7이 추가되는 경우는 위에 답변드린 쿼리로 커버가 됩니다.
항상 감사드립니다.
LEAD(input_ymd || input_hms, 1, '99991231235959') OVER(PARTITION BY key ORDER BY input_ymd, input_hms) etm 이 문장을 사용하지 않고 할 수 있는 방법은 없을까요? 간단한 syntax로 한번더 부탁 드립니다.
다음 행의 값을 확인하는 가장 간단한 신텍스 인데요?
분석함수를 사용할 수 없었을 시절에는
셀프조인과 그룹바이를 복잡하게 사용해야만 했었죠.
성능 또한 느렸구요.
사실은 my sql 사용해야 하는데... 그 쪽은 제가 해본적이 없어서 간단한 sql 명령어만 적용이 가능해서 드린겁니다... 감사합니다.
my sql에서 데이터를 가지고 와서 oracle로 넣어놓고 처리 해야 할 듯 합니다.
거듭 감사합니ㅏㄷ.
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 ;
잘 됩니다.....정말 감사합니다..