반응형
[ 상황 ]
매일 들어오는 데이터를 월별로 말일자만 집계하여 보려고 합니다.
이때, 해당월이 말일자에 도래하지 않아도 가장 최근 일자로 집계하여 보고자 합니다.
ex) 오늘이 2022-06-22인 경우, 2022-06-31의 데이터가 없으니 2022-06-22 데이터로 집계
[ 해결방법 ]
1) TABLE에 들어있는 날짜 데이터 파악하기
- 아래와 같이 날짜로 GROUP BY하여 조회하면 일자별로 데이터가 존재하는 것을 확인할 수 있습니다.
SELECT PROC_DATE
FROM TABLE
GROUP BY PROC_DATE
ORDER BY 1 DESC
2) LAST_DAY 함수 사용하기
LAST_DAY 함수란?
- 오라클에서 해당월의 마지막 날짜를 가져오는 함수
- 사용법
LAST_DAY(DATE 값)
- 예제
오늘이 2022-06-22일 때, LAST_DAY => 2022-06-30인 것을 확인할 수 있습니다.
SELECT LAST_DAY(SYSDATE)
, SYSDATE
FROM DUAL;
- LAST_DAY 함수를 사용하면 아래와 같이 쉽게 말일자만 구할 수 있지만,
아직 말일자가 도래하지 않은 6월의 데이터는 확인할 수 없습니다.
SELECT PROC_DATE
FROM TABLE
WHERE PROC_DATE = LAST_DAY(PROC_DATE) --매월 말일자만 집계하도록 수정
GROUP BY PROC_DATE
ORDER BY 1 DESC
3) 말일자가 도래하지 않은 경우 가장 최근 날짜로 집계하기
- 아래와 같은 방법으로 하면 될 것 같다는 생각이 '번쩍' 떠올랐습니다.
말일자가 도래하지 않은 6월도 가장 최근 일자인 06-02일의 데이터가 조회됩니다. 성공!
SELECT PROC_DATE
FROM TABLE
WHERE PROC_DATE IN (SELECT MAX(PROC_DATE)
FROM TABLE
GROUP BY TO_CHAR(PROC_DATE, 'YYYY-MM'))
GROUP BY PROC_DATE
ORDER BY 1 DESC
4) 원리 파악하기
- '년-월(YYYY-MM)' 형식으로 그룹하여 MAX값을 구하는 방식으로 해결했습니다.
SELECT PROC_DATE
, TO_CHAR(PROC_DATE, 'YYYY-MM') AS YM
FROM TABLE
GROUP BY PROC_DATE
ORDER BY PROC_DATE DESC
- 현재 6월의 가장 최근 데이터는 2022-06-02 데이터 입니다.
년월로 그룹화하였을 때, 아래 2개의 데이터가 존재하는데
이 중에서 MAX값을 가져오면 월별로 가장 큰 날짜의 값을 구할 수 있습니다.
끝 !!
반응형
'Database > Oracle' 카테고리의 다른 글
[Oracle] comment로 테이블, 컬럼 찾기 (2) | 2022.08.03 |
---|---|
[Oracle] 오라클 날짜, 한글 요일 구하기 (Feat. TO_CHAR) (0) | 2022.07.01 |
[Oracle] 오라클 TRUNC 함수 사용법 (날짜, 시간, 소수점 절사하기) (0) | 2022.06.30 |
[Oracle] 천단위 구분기호 출력하는 방법 (0) | 2022.06.23 |
[Oracle] 쿼리 속도 향상 시키기 (Feat. 좌변을 가공하지 않기) (0) | 2022.06.10 |