두개의 컬럼으로 구성된 날짜 정렬 쿼리 0 5 1,849

by 기타중독 [MySQL] [2013.03.28 18:02:53]


안녕하십니까? 

시간만 잡아먹고 해결하지 못한 문제가 있어 염치 불구 하고 질문 드립니다.

하나의 테이블에 아래와 같이 CHG_DATE, END_DATE 컬럼이 있습니다.

CHG_DATE             END_DATE
2013-01-01 오전 12:00:00	 2013-03-14 오전 12:00:00
2013-01-01 오전 12:00:00	 2013-02-27 오전 12:00:00
2013-01-01 오전 12:00:00	 2013-03-31 오전 12:00:00
2013-02-28 오전 12:00:00	 2013-03-31 오전 12:00:00
2013-03-15 오전 12:00:00	 2013-03-31 오전 12:00:00


제가 쿼리로 구하고 싶은 결과는 아래와 같습니다.

2013-01-01 오전 12:00:00     2013-02-27 오전 12:00:00 
2013-02-28 오전 12:00:00     2013-03-14 오전 12:00:00
2013-03-15 오전 12:00:00     2013-03-31 오전 12:00:00


아래 쿼리로 쉽게 처리 할 수 있을지 알았는데 잘못된 생각이었습니다.

SELECT CHG_DATE, MIN(END_DATE)
FROM ***
GROUP BY CHG_DATE



쿼리로 해결 가능한지 답변 부탁드립니다.


by 손님 [2013.03.28 19:20:35]
도움될지 모르겠습니다.
허접하네요

WITH A AS (
SELECT TO_DATE('2013-01-01 오전 12:00:00', 'YYYY-MM-DD  A.M. HH:MI:SS')  as CHG_DATE  , TO_DATE('2013-03-14 오전 12:00:00', 'YYYY-MM-DD  A.M. HH:MI:SS') as END_DATE FROM DUAL UNION ALL
SELECT TO_DATE('2013-01-01 오전 12:00:00', 'YYYY-MM-DD  A.M. HH:MI:SS')  , TO_DATE('2013-02-27 오전 12:00:00','YYYY-MM-DD  A.M. HH:MI:SS') FROM DUAL UNION ALL
SELECT TO_DATE('2013-01-01 오전 12:00:00' ,'YYYY-MM-DD  A.M. HH:MI:SS')  , TO_DATE('2013-03-31 오전 12:00:00','YYYY-MM-DD  A.M. HH:MI:SS') FROM DUAL UNION ALL
SELECT TO_DATE('2013-02-28 오전 12:00:00', 'YYYY-MM-DD  A.M. HH:MI:SS')  , TO_DATE('2013-03-31 오전 12:00:00','YYYY-MM-DD  A.M. HH:MI:SS') FROM DUAL UNION ALL
SELECT TO_DATE('2013-03-15 오전 12:00:00', 'YYYY-MM-DD  A.M. HH:MI:SS')  , TO_DATE('2013-03-31 오전 12:00:00','YYYY-MM-DD  A.M. HH:MI:SS') FROM DUAL

--SELECT * FROM A
/* 
SELECT a.CHG_DATE, MIN(END_DATE) OVER( PARTITION BY END_DATE ORDER BY END_DATE )
FROM A a
GROUP BY a.CHG_DATE
ORDER BY a.CHG_DATE
*/
SELECT
  a.CHG_DATE , b.END_DATE
FROM
  (SELECT CHG_DATE , RANK() OVER (ORDER BY CHG_DATE ) seq FROM A GROUP BY CHG_DATE ) a
 ,(SELECT END_DATE , RANK() OVER (ORDER BY END_DATE ) seq FROM A GROUP BY END_DATE ) b
 ,(SELECT LEVEL seq FROM DUAL CONNECT BY LEVEL <= 10 ) c
WHERE
    c.seq = a.seq(+)
AND c.seq = b.seq(+) 

by 아린 [2013.03.28 20:20:02]
SELECT REGEXP_SUBSTR(chg_date, '[^,]+', 1, lv) chg_date
     , REGEXP_SUBSTR(end_date, '[^,]+', 1, lv) end_date
  FROM (SELECT WM_CONCAT(DISTINCT chg_date) chg_date
             , WM_CONCAT(DISTINCT end_date) end_date
          FROM t
        ) t  
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 100) d
 WHERE GREATEST(LENGTH(chg_date) - LENGTH(REPLACE(chg_date, ',')) + 1
              , LENGTH(end_date) - LENGTH(REPLACE(end_date, ',')) + 1) >= lv

by 마농 [2013.03.29 09:36:10]
-- 보여 주신 예시 자료만으로는 판단하기 힘듭니다.
-- 데이터 자체가 정규화가 안되어 있어,
-- 일정한 규직을 정하고 그에 따라 자료를 추출해야 하는데.
-- 위 자료만 같다면 위 두분 답글과 같은 형태로 추출이 가능하긴 합니다만.
-- 좀 더 복잡하고 다양한 형태의 자료가 있을 것으로 생각됩니다.
-- 일단은 저도 위에 두분과 같이 위 간단 예시자료만 보고 답글 드립니다.
-- 실제 원하는 결과가 아닐 수 도 있겠네요.
SELECT MIN(dt) sdt
     , MAX(dt) edt
  FROM (SELECT @rn := @rn + 1 AS rn
             , a.dt
          FROM (SELECT @rn := 0) b
             , (SELECT sdt dt FROM t
                 UNION
                SELECT edt dt FROM t
                 ORDER BY dt
                ) a
        ) c
 GROUP BY CEIL(rn/2)
 ORDER BY sdt
;

by 기타중독 [2013.03.29 10:03:11]
마농님 답변 감사합니다.

UNION 한다음에 ROWNUM으로 GROUP BY 할지는 생각도 못했었습니다.

갑사합니다.

by 기타중독 [2013.03.29 09:38:12]
답변 감사합니다만 Mysql 이라 CONNECT BY 절은 사용할 수 없습니다
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입