오라클에서 OVER() 를 사용하면
GROUP BY나 서브쿼리를 사용하지 않고
분석 함수(SUM, MAX, COUNT)과
집계 함수(GROUP BY, ORDER BY)를 사용할 수 있는데
집계 함수 사용 시
서브쿼리가 지나치게 길어지는 것을 고려해보면
OVER를 사용해 쿼리 길이를 획기적으로 줄일 수 있다
OVER()는
분석_함수() OVER(PARTITION BY 컬럼 / ORDER BY 컬럼 / 세부 분할 기준)
으로 이루어지는데
여기서 분석 함수와 OVER()는 필수지만
OVER 안의 내용들은
필요할 경우에만 작성해주면 된다
(RANK, DENSE_RANK는 ORDER BY 필수)
분석 함수에는
COUNT(컬럼) - 갯수
SUM(컬럼) - 합계
AVG(컬럼) - 평균
MAX(컬럼) - 최대값
MIN(컬럼) - 최소값
RANK() OVER(ORDER BY 컬럼...) - 순위
DENSE_RANK() OVER(ORDER BY 컬럼...) - 중복 순위가 있어도 1씩 증가
등이 사용되며
전체 명단은 아래 링크를 참조해주면 된다
PARTITION BY 컬럼은
어느 컬럼을 기준으로 쪼갤지를 의미한다
GROUP BY와 동일한 기능이라고 보면 되며
PARTITION BY JOB로 했을 시
JOB를 기준으로 쪼개개 된다
ORDER BY 컬럼은
정렬 시 기준을 설정해주며
기본은 오름차순이고 내림차순으로 설정해주려면
ORDER BY 컬럼 DESC를 써주면 된다
세부 분할 기준은
windowing_clause 라고 하는데
PARTITION BY, ORDER BY로
충분히 분할하지 못했을 경우 사용하며
ORDER BY를 사용한 상태에서만 적용 가능하다
세부 분할 기준은
조건에 맞는 ROW를 가지고 정렬하는
ROWS BETWEEN start_point AND end_point와
조건에 맞는 값을 가지고 정렬하는
RANGE BETWEEN start_point AND end_point
으로 나누어지는데
start_point에는
UNBOUNDED PRECEDING - 첫줄부터
CURRENT ROW - 현재 줄까지
값 PRECEDING - 값부터
end_point에는
UNBOUNDED FOLLOWING - 마지막 줄까지
CURRENT ROW - 현재 줄까지
값 FOLLOWING - 값까지
가 들어가게 된다
ROWS를 사용한 예제를 보면
BETWEEN 1 PRECENDING AND 2 FOLLOWING
이 보이는데
해당하는 줄과 그 다음줄만 가지고
AVG를 수행한다는 말이다
가장 하단 컬럼을 보면
2850 + 1600 / 2 를 한 값인
2225가 OVER_COL로 들어오는 것이 보인다
다음으로 RANGE를 사용한 예제를 보면
INTERVAL '3' MONTH를 사용하여
전후 3개월로 조건을 걸어준 뒤
수행한 것이 보이는데
가장 하단을 보면
12월 입사 기준으로 전후 3개월은
1981년 9월 ~ 1982년 3월이기 때문에
해당 값에 해당하는
1500 + 1250 + 950 / 3이 되어
OVER_COL에 1233.33이 나오게 되는 것이다
'SQL > Oracle' 카테고리의 다른 글
오라클 WHERE OR 문 사용방법 (2) | 2020.05.14 |
---|---|
오라클 ROWNUM 개념부터 활용까지 (0) | 2020.04.19 |
오라클 CONCAT, ||를 이용한 문자열 합치기 및 예제 (0) | 2020.03.30 |
오라클 DISTINCT를 이용한 중복제거 예제 및 사용방법 (0) | 2020.03.28 |
오라클 GROUP BY, HAVING 예제 및 사용방법 (0) | 2020.03.28 |
댓글