PARTITION
함수란?
그룹 내 순위 및 그룹별 집계를 구할 때 사용하는 함수
PARTITION
함수 사용방법
SELECT 순위함수() OVER(PARTITION BY 컬럼명 ORDER BY 컬럼명)
FROM 테이블명
SELECT 집계함수(컬럼명) OVER (PARTITION BY 컬럼명)
FROM 테이블명
참고로,
순위함수 : ROW_NUMBER, RANK, DENSE_RANK
집계함수 : SUM, AVG, MAX, MIN, COUNT
또, PARTITION BY 절 뒤에 여러개의 컬럼명을 추가하는것도 가능하다 :)
그런데, GROUP BY절
을 이용해도 그룹으로 데이터를 묶는것이 가능하다.
하지만 GROUP BY절과 PARTITION BY절은 다른점이 있다.
집계함수인 SUM 함수를 이용해서 두 절의 차이점을 알아보자~
이런 테이블이 있다고 가정해보자! 테이블명은 EMP!
EMPNO | ENAME | JOB | SUM(SAL) |
---|---|---|---|
1000 | kim | MANAGER | 1000 |
1001 | hong | MANAGER | 2000 |
1002 | shim | SALESMAN | 1500 |
1003 | lee | SALESMAN | 2500 |
일단 먼저, 직업에 따라 급여를 계산하고 싶다고 하면,
사용구문
SELECT job, SUM(sal)
FROM emp
WHERE job IN ('MANAGER','SALESMAN')
GROUP BY job
ORDER BY job
결과
JOB | SUM(SAL) |
---|---|
MANAGER | 3000 |
SALESMAN | 4000 |
사용구문
SELECT empno, ename, job, SUM(sal) OVER(PARTITION BY job)
FROM emp
WHERE job IN ('MANAGER','SALESMAN')
ORDER BY job
결과
EMPNO | ENAME | JOB | SUM(SAL) |
---|---|---|---|
1000 | kim | MANAGER | 3000 |
1001 | hong | MANAGER | 3000 |
1002 | shim | SALESMAN | 4000 |
1003 | lee | SALESMAN | 4000 |
위 예제에서 보이는것 처럼 가장 큰 차이점은
데이터의 변형 여부
이다.
GROUP BY절
의 경우 기존행에 있던 데이터는 작성한 쿼리에 의해 새롭게 생성된 행에 입력된다.
그 과정에서 기존의 상세 데이터 값은 잃게 된다.
하지만 PARTITION BY절
의 경우, GROUP BY절과 집계된 값은 동일하지만 집계된 값을 새로운 행에 넣는것이 아닌, 기존 행에 추가로 표시하기 때문에 데이터의 변형이 일어나지 않는다.
집계함수를 이용해 분석된 결과만 확인하고 싶을 경우에는 GROUP BY절을 사용해도 괜찮지만,
기존의 행과 새로 구한값을 세세하게 확인하고 싶을때는 PARTITION BY절이 더 좋다~~~
SUM 함수를 사용 해 봤으니 다른 함수도 사용해보쟈
사용구문
SELECT empno, ename, job, sal, MAX(SAL) OVER(PARTITION BY job)
FROM emp
WHERE job IN ('MANAGER','SALESMAN')
ORDER BY job
결과
EMPNO | ENAME | JOB | SUM(SAL) |
---|---|---|---|
1000 | kim | MANAGER | 2000 |
1001 | hong | MANAGER | 2000 |
1002 | shim | SALESMAN | 2500 |
1003 | lee | SALESMAN | 2500 |
사용구문
SELECT empno, ename, job, sal,
ROW_NUMBER() OVER(PARTITION BY job ORDER BY sal) AS rn
FROM emp
WHERE job IN ('MANAGER', 'SALESMAN')
ORDER BY job
결과
EMPNO | ENAME | JOB | SUM(SAL) | RN |
---|---|---|---|---|
1001 | hong | MANAGER | 2000 | 1 |
1000 | kim | MANAGER | 1000 | 2 |
1003 | lee | SALESMAN | 2500 | 1 |
1004 | shime | SALESMAN | 1500 | 2 |
참고로, ROW_NUMBER 함수와 RANK 함수 모두 순위를 구할 때 사용한다.
대신 ROW_NUMBER 함수
의 경우 동일 순위의 값이 있을 경우 정렬 순서에 따라 순위를 입력하고,
RANK 함수
의 경우 동일 순위의 값이 있을 경우 동일한 순위를 표시한다.
내가 만든 테이블의 경우 겹치는 값이 따로 없으니 패스!