select to_date('20121012', 'yyyy-mm-dd') col from dual union all select to_date('20121011', 'yyyy-mm-dd') col from dual union all select to_date('20121009', 'yyyy-mm-dd') col from dual union all select to_date('20121008', 'yyyy-mm-dd') col from dual union all select to_date('20121005', 'yyyy-mm-dd') col from dual; 다음과 같은 QUERY가 있습니다. 오늘 날짜를 기준으로 가장 최근 입력된 날짜와 가장 최근 입력된 날짜의 가장 가까운 이전일을 구하는 QUERY를 알고 싶습니다. 날짜가 계속 이어지는 경우도 있지만, 그렇지 않은 경우도 있습니다. 예를 들어, 검색 기준일이 2012-10-14 일이 된다면, 가장 최근일은 2012-10-12일이 될 것이고, 최근 날짜의 이전일은 2012-10-11일이 됩니다. 만약, 검색 기준일이 2012-10-11 이라면, 가장 최근일은 2012-10-11일이 될 것이고, 최근 날짜의 이전일은 2012-10-09일이 될 것입니다. 응용하여, 최근 날짜의 바로 이전일이 아닌, 이전 이전일, 이전 이전 이전일 등을 구할 수 있도록 유동적이면 더 좋을 것 같습니다. 아참, 그리고 만약, 마지막 날짜가 2012-10-15일인데 그 이전의 날짜 데이터가 없다면, 2012-10-15일로 값이 나오도록 하고싶습니다. 고수님들 부탁드립니다. ^^
WITH t AS ( SELECT TO_DATE('20121012', 'yyyymmdd') col FROM dual UNION ALL SELECT TO_DATE('20121011', 'yyyymmdd') FROM dual UNION ALL SELECT TO_DATE('20121009', 'yyyymmdd') FROM dual UNION ALL SELECT TO_DATE('20121008', 'yyyymmdd') FROM dual UNION ALL SELECT TO_DATE('20121005', 'yyyymmdd') FROM dual ) SELECT ROWNUM rn , a.dt, b.col , NVL(b.col, a.dt) result FROM (SELECT a.dt, b.col FROM (SELECT sysdate dt FROM dual) a -- 검색기준일 LEFT OUTER JOIN t b ON a.dt >= b.col ORDER BY b.col DESC ) WHERE ROWNUM <= 2 -- 원하는일수 ;
WITH t AS ( SELECT TO_DATE('20121012', 'yyyymmdd') col FROM dual UNION ALL SELECT TO_DATE('20121011', 'yyyymmdd') FROM dual UNION ALL SELECT TO_DATE('20121009', 'yyyymmdd') FROM dual UNION ALL SELECT TO_DATE('20121008', 'yyyymmdd') FROM dual UNION ALL SELECT TO_DATE('20121005', 'yyyymmdd') FROM dual ) SELECT a.dt , MIN(DECODE(ROWNUM, 1, b.col)) dt_1 , MIN(DECODE(ROWNUM, 2, b.col)) dt_2 FROM (SELECT a.dt, b.col FROM (SELECT sysdate dt FROM dual) a -- 검색기준일 LEFT OUTER JOIN t b ON a.dt >= b.col ORDER BY b.col DESC ) WHERE ROWNUM <= 2 -- 원하는일수 GROUP BY a.dt ;