* 데이터 | ||||||||
PK1 | PK2 | PK3 | PK4 | |||||
T1 | FIST_DT | SEQ_NO | SEQ_NEXT_NO | STAR_DT | END_DT | AD_DT | GUBUN | |
283 | 20130210 | 1 | 2 | 20170725 | 20170725 | 20170907 | 10 | |
283 | 20130210 | 1 | 3 | 20170726 | 20170726 | 20170907 | 10 | |
283 | 20130210 | 1 | 4 | 20170808 | 20170808 | 20170907 | 10 | |
283 | 20130210 | 1 | 6 | 20171015 | 20180114 | 20170907 | 10 | |
283 | 20130210 | 1 | 12 | 20171104 | 20180114 | 20171107 | 10 | |
283 | 20130210 | 1 | 5 | 20170815 | 20171014 | 20170907 | 20 | |
283 | 20130210 | 1 | 13 | 20171106 | 20171204 | 20071115 | 20 | |
*결과 | ||||||||
PK1 | PK2 | PK3 | 생성 PK | MAX값 | 10중에 STAR_DT 가 가장 작은값 | 10중에 STAR_DT 가 가장 작은값의 END_DT | 20중에 STAR_DT 가 가장 작은값 | 20중에 STAR_DT 가 가장 작은값 |
T1 | FIST_DT | SEQ_NO | NEW_SEQ | AD_DT | STAR_DT_10 | END_DT_10 | STAR_DT_20 | END_DT_20 |
283 | 20130210 | 1 | 1 | 20171107 | 20170725 | 20170725 | 20170815 | 20171014 |
위에 로우와 동일 | 위에 로우와 동일 | 위에 로우와 동일 | 시퀀스하게 생성 | 위에 로우와 동일 | 10중에 위에 로우 뺀 STAR_DT MIN 값 | 10중에 위에 로우 뺀 END_DT MAX 값 | 20중에 위에 로우 뺀 STAR_DT MIN 값 | 20중에 위에 로우 뺀 END_DT MAX 값 |
283 | 20130210 | 1 | 2 | 20171107 | 20170726 | 20180114 | 20171106 | 20171204 |
위에 데이터를 패턴 데이터를 2개의 로우로 생성을 하는데 처음 생성하는 데이터는 PK 1 2 3 기준으로 AD_DT의 MAX값을 가져가서 생성하고 나머지 컬럼은 비교를 하여 따로따로 붙여야 되는 상황 입니다. 어떻게 해야 될까요 자세한 설명은 말로 풀기가 힘들어서 표로 표현 했습니다. WITH t AS ( SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 2 SEQ_NEXT_NO, '20170725' STAR_DT, '20170725' END_DT, '20170907' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 3 SEQ_NEXT_NO, '20170726' STAR_DT, '20170726' END_DT, '20170907' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 4 SEQ_NEXT_NO, '20170808' STAR_DT, '20170808' END_DT, '20170907' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 6 SEQ_NEXT_NO, '20171015' STAR_DT, '20180114' END_DT, '20170907' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 12 SEQ_NEXT_NO, '20171104' STAR_DT, '20180114' END_DT, '20171107' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 5 SEQ_NEXT_NO, '20170815' STAR_DT, '20171014' END_DT, '20170909' AD_DT, '20' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 13 SEQ_NEXT_NO, '20171106' STAR_DT, '20171204' END_DT, '20071115' AD_DT, '20' GUBUN )
-- MS-SQL이 구버젼이라 DENCE_RANK() 는 테스트 안됨.. ㅡㅡ; WITH t AS ( SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 2 SEQ_NEXT_NO, '20170725' STAR_DT, '20170725' END_DT, '20170907' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 3 SEQ_NEXT_NO, '20170726' STAR_DT, '20170726' END_DT, '20170907' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 4 SEQ_NEXT_NO, '20170808' STAR_DT, '20170808' END_DT, '20170907' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 6 SEQ_NEXT_NO, '20171015' STAR_DT, '20180114' END_DT, '20170907' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 12 SEQ_NEXT_NO, '20171104' STAR_DT, '20180114' END_DT, '20171107' AD_DT, '10' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 5 SEQ_NEXT_NO, '20170815' STAR_DT, '20171014' END_DT, '20170909' AD_DT, '20' GUBUN UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 13 SEQ_NEXT_NO, '20171106' STAR_DT, '20171204' END_DT, '20071115' AD_DT, '20' GUBUN ) , T2 AS ( SELECT 1 lv UNION ALL SELECT lv + 1 lv FROM T2 WHERE lv + 1 <= 2 ) SELECT T1 , FIST_DT , SEQ_NO , LV AS NEW_SEQ , MAX_STAR_DT AS AD_DT , CASE WHEN lv = 1 THEN STAR_DT_10_1 ELSE STAR_DT_10_2 END STAR_DT_10 , CASE WHEN lv = 1 THEN END_DT_10_1 ELSE END_DT_10_2 END END_DT_10 , CASE WHEN lv = 1 THEN STAR_DT_20_1 ELSE STAR_DT_20_2 END STAR_DT_20 , CASE WHEN lv = 1 THEN END_DT_20_1 ELSE END_DT_20_2 END END_DT_20 FROM (SELECT MAX(A.T1) T1 , MAX(A.FIST_DT) FIST_DT , MAX(A.SEQ_NO) SEQ_NO , MAX(A.MAX_STAR_DT) MAX_STAR_DT , MAX(CASE WHEN STAR_DT_MIN_SORT = 1 AND GUBUN = 10 THEN STAR_DT END ) STAR_DT_10_1 , MAX(CASE WHEN STAR_DT_MIN_SORT = 2 AND GUBUN = 10 THEN STAR_DT END ) STAR_DT_10_2 , MAX(CASE WHEN END_DT_MIN_SORT = 1 AND GUBUN = 10 THEN END_DT END ) END_DT_10_1 , MAX(CASE WHEN END_DT_MIN_SORT = 2 AND GUBUN = 10 THEN END_DT END ) END_DT_10_2 , MAX(CASE WHEN STAR_DT_MIN_SORT = 1 AND GUBUN = 20 THEN STAR_DT END ) STAR_DT_20_1 , MAX(CASE WHEN STAR_DT_MIN_SORT = 2 AND GUBUN = 20 THEN STAR_DT END ) STAR_DT_20_2 , MAX(CASE WHEN END_DT_MIN_SORT = 1 AND GUBUN = 20 THEN END_DT END ) END_DT_20_1 , MAX(CASE WHEN END_DT_MIN_SORT = 2 AND GUBUN = 20 THEN END_DT END ) END_DT_20_2 FROM ( SELECT T1 , FIST_DT , SEQ_NO , SEQ_NEXT_NO , GUBUN , STAR_DT , END_DT , MAX(AD_DT) OVER() MAX_STAR_DT , DENCE_RANK() OVER(PARTITION BY GUBUN ORDER BY STAR_DT ASC ) STAR_DT_MIN_SORT , DENCE_RANK() OVER(PARTITION BY GUBUN ORDER BY END_DT DESC ) END_DT_MIN_SORT FROM T ) A ) AA , T2 BB
음...
제목은 오라클인데? WITH 구문은 FROM dual 이 없는걸로 보면 오리클이 아닌데요?
제목대로 오라클로 답변합니다.
WITH t AS ( SELECT 283 t1, '20130210' fist_dt, 1 seq_no, 2 seq_next_no, '20170725' star_dt, '20170725' end_dt, '20170907' ad_dt, '10' gubun FROM dual UNION ALL SELECT 283, '20130210', 1, 3, '20170726', '20170726', '20170907', '10' FROM dual UNION ALL SELECT 283, '20130210', 1, 4, '20170808', '20170808', '20170907', '10' FROM dual UNION ALL SELECT 283, '20130210', 1, 6, '20171015', '20180114', '20170907', '10' FROM dual UNION ALL SELECT 283, '20130210', 1, 12, '20171104', '20180114', '20171107', '10' FROM dual UNION ALL SELECT 283, '20130210', 1, 5, '20170815', '20171014', '20170909', '20' FROM dual UNION ALL SELECT 283, '20130210', 1, 13, '20171106', '20171204', '20071115', '20' FROM dual ) SELECT * FROM (SELECT t1, fist_dt, seq_no, gubun , new_seq , ad_dt , star_dt st_dt , CASE WHEN new_seq = 1 THEN end_dt ELSE end_dt_2 END ed_dt FROM (SELECT t1, fist_dt, seq_no, gubun , star_dt, end_dt , ROW_NUMBER() OVER(PARTITION BY t1, fist_dt, seq_no, gubun ORDER BY star_dt) new_seq , MAX( ad_dt ) OVER(PARTITION BY t1, fist_dt, seq_no, gubun) ad_dt , MAX(end_dt ) OVER(PARTITION BY t1, fist_dt, seq_no, gubun) end_dt_2 FROM t ) a WHERE new_seq <= 2 ) a PIVOT (MIN(ad_dt) ad_dt, MIN(st_dt) st_dt, MIN(ed_dt) ed_dt FOR gubun IN (10, 20, 30)) a ;