작성일자 : 2023-11-07
Ver 0.1.1
1. PARTITION BY
PARTITION BY는 특정 열을 기준으로 데이터를 나누는 함수로 이전에 한번 WINDOW 함수와 다룬적이 있다.
OVER
통계값이나 집계를 구할 때 집계함수는 집계되지 않은 컬럼과 같이 사용할 수 없다.
이에 서브쿼리를 통해 집계 데이터를 구하게 되는데, 이 경우 서브쿼리 대신 OVER 절을 통해 간단하게 집계 데이터를 구하는게 가능해진다.
또한 GROUP BY, ORDER BY가 복잡하게 섞인 쿼리까지 간단하게 표현할 수 있다.
GROUP BY 절을 사용하지 않고, 조회된 각 행에 집계된 값을 표현할 때 OVER 절과 함께 사용된다.
이때 PARTIION BY를 사용하지 않으면 모든 행이 단일 행으로 취급된다.
SELECT EMPNO
,ENAME
,JOB
,SAL
,ROUND(AVG(SAL) OVER (),1) AS AVG_SAL -- 모든 행에 대한 평균
FROM SCOTT.EMP
2. OVER (PARTITION BY) 와 GROUP BY의 차이점
사실 PARTITION BY와 GROUP BY의 차이점에 대해서 정리하고자 이번 글을 작성했다.
둘다 집계를 한다는 공통점이 있지만, 큰 차이가 분명히 존재하기 때문이다.
GROUP BY
- 데이터를 분류하여 집계하는 부분은 같으나, 각 분류에 따라 고유한 하나의 행만 출력
SELECT JOB
,ROUND(AVG(SAL),1) AS AVG_SAL
FROM SCOTT.EMP
GROUP BY JOB
PARTITION BY
- 각 분류에 따라 하나의 행으로 압축하여 출력하지 않고, 모든 ROW를 그대로 출력하되 집계된 컬럼이 추가로 출력
SELECT EMPNO
,ENAME
,JOB
,SAL
,ROUND(AVG(SAL) OVER (PARTITION BY JOB),1) AS AVG_SAL -- JOB 별로 평균 계산
FROM SCOTT.EMP
3. Wrap up
GROUP BY와 PARTITION BY는 집계를 한다는 공통점이 있지만, 출력 결과가 다르다.
GROUP BY | PARTITION BY | |
사용 | 그룹 외부에서 묶어 순위 및 그룹별 집계를 구할 떄 사용 | 그룹 내 순위 및 그룹별 집계를 구할 때 사용 |
결과 | 특정 원하는 컬럼에 대해서 추출해 결과값 보여줌 | 전체 데이터에서 원하는 결과값 보여줌 |
GROUP BY는 집계된 값들의 결과만 보고 싶을 때 사용할 수 있고,
PARTIION BY는 집계된 값과 특정 값의 비교가 필요할 때 사용할 수 있을 것이다. (ex. 특정 사원의 급여 vs 부서의 평균 급여)
이에 분석 또는 조회하고자 하는 결과에 대해서 생각해보고 이를 고려하여 상황에 맞게 선택하여 쿼리를 작성하면 될 것이다.