가장최근일과 가장최근일의 이전 날짜 구하는 방법을 알고 싶습니다. 0 6 6,188

by 망뎅이 [SQL Query] 날짜 DATE [2012.10.14 23:26:35]


  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일로 값이 나오도록 하고싶습니다. 고수님들 부탁드립니다. ^^
by 마농 [2012.10.15 08:16:07]
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 -- 원하는일수
;

by 손님 [2012.10.15 09:36:20]
마농님, 감사합니다 ^^

by 망뎅이 [2012.10.15 09:36:47]
마농님, 감사합니다 ^^

by 망뎅이 [2012.10.15 09:46:18]
 마농님, 만약, ROWNUM을 넣어주는 경우, ROWNUM에 해당하는 ROW수만큼 레코드가 발생하는데, 제가 출력하고 싶은 것은


검색기준일 / 가장 최근날짜 / 가장 최근날짜의 이전일

이렇게 3 컬럼으로 1Row만 출력되도록 하고 싶습니다. 어떻게 해야할까요? ㅠㅠ

by 마농 [2012.10.15 09:53:03]
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
;

by 망뎅이 [2012.10.15 10:37:19]
정말 정말 감사합니다 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입