SQL/Oracle

[Oracle] OVER (PARTITION BY) & GROUP BY

Unlimited Jun 2023. 11. 7. 23:11

작성일자 : 2023-11-07

Ver 0.1.1

1. PARTITION BY

PARTITION BY는 특정 열을 기준으로 데이터를 나누는 함수로 이전에 한번 WINDOW 함수와 다룬적이 있다.

 

[SQL]PARTITION/WINDOW

작성일자 : 2023-07-12 수정일자 : 2023-07-23 Ver : 0.1.3 1. 분석 함수(Analytic Function) 개별 행을 유지한 채 집계 값을 계산할 수 있는 함수이다. 집계 함수 (Aggregate Functions)는 행 그룹 별로 값을 집계하고,

junius96.com

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 부서의 평균 급여)

 

이에 분석 또는 조회하고자 하는 결과에 대해서 생각해보고 이를 고려하여 상황에 맞게 선택하여 쿼리를 작성하면 될 것이다.