SELECT 할 때에 GROUP BY한 내용중 최고값과 최저값을 찾아야 하는 경우가 있습니다.
그럴 땐 쉽게 쉽게 MAX와 MIN을 쓸수가 있겠지만, 특정한 그룹으로 재그룹핑 해서 찾고 싶기도
하죠. 그래서 MAX OVER나 MIN OVER를 쓰게 되는거죠.
MAX(구하고자하는_최고값의_컬럼명) OVER (ORDER BY 기준_컬럼1, 기준_컬럼2, ...) AS MAX_DATA
MIN(구하고자하는_최고값의_컬럼명) OVER (PARTITION BY 기준_컬럼1, 기준_컬럼2, ...) AS MAX_DATA
위의 구조는 다음과 같습니다. MAX에는 기존과 함수와 같이 구하고자 하는 컬럼명을 그대로 넣고
OVER 함수 안에는 어떤 기준으로 할 것인지를 정합니다. 즉, OVER 함수안에서 재 그룹핑을 하는 것이죠.
OVER 함수 안에서는 그룹핑하기 위해 ORDER BY나 PARTITION BY를 씁니다.
단, MIN에선S PARTITION BY를 해야 MIN 값이 나오더군요.
이부분을 잘모르겠는데 혹시 하시는 분은 답글 부탁드립니다.
아래 쿼리는 위와 같이 MAX와 MIN을 구한 뒤, 구한 MAX와 MIN으로 그룹핑하는 쿼리입니다.
SELECT CAMPAIGNID,CHANNELID,ACNO,MAX_TYPE,MAX_DATE
FROM (
-- 각 데이터 별, MAX TYPE, DATE를 조회
SELECT CAMPAIGNID,CHANNELID,ACNO
,MAX(RESPONSETYPE) OVER(ORDER BY CAMPAIGNID,CHANNELID,ACNO) AS MAX_TYPE
,MAX(RESPONSEDATE) OVER(ORDER BY CAMPAIGNID,CHANNELID,ACNO) AS MAX_DATE
,MIN(RESPONSETYPE) OVER(PARTITION BY CAMPAIGNID,CHANNELID,ACNO) AS MIN_TYPE
,MIN(RESPONSEDATE) OVER(PARTITION BY CAMPAIGNID,CHANNELID,ACNO) AS MIN_DATE
FROM 원하는_테이블명
GROUP BY CAMPAIGNID,CHANNELID,ACNO,RESPONSETYPE,RESPONSEDATE
ORDER BY ACNO,CAMPAIGNID,CHANNELID
)
GROUP BY CAMPAIGNID,CHANNELID,ACNO,MAX_TYPE,MAX_DATE
ORDER BY ACNO,CAMPAIGNID,CHANNELID
'DB > 오라클' 카테고리의 다른 글
[오라클] COMMIT 복구 (0) | 2014.12.29 |
---|---|
[오라클] BASE 64 사용법 (0) | 2014.12.22 |
[오라클] 분석 함수 (1) | 2014.11.21 |
[오라클][PLSQL] 테이블과 초기화 (0) | 2014.11.07 |
[오라클] 특정 문자로 문자열 자르기 (0) | 2014.11.05 |
WRITTEN BY