
PARTITION BY는 Oracle SQL에서 분석 함수(Analytic Function)와 함께 사용되어, 데이터를 논리적으로 그룹화한 후 그 그룹 내에서 계산을 수행할 수 있도록 해주는 매우 유용한 기능입니다.
SQL에서 PARTITION BY는 데이터를 가상의 그룹으로 나누는 역할을 합니다. 일반적으로 RANK(), DENSE_RANK(), ROW_NUMBER(), SUM(), AVG() 등과 같은 분석 함수와 함께 사용됩니다.
함수명() OVER (PARTITION BY 컬럼명 ORDER BY 컬럼명)
아래는 PARTITION BY 없이 RANK()를 사용하는 예제입니다.
SELECT ename, deptno, sal,
RANK() OVER (ORDER BY sal DESC) AS rank_global
FROM emp;
전체 데이터에 대해 급여 기준으로 순위를 계산합니다.
SELECT ename, deptno, sal,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS rank_in_dept
FROM emp;
| ename | deptno | sal | rank_in_dept |
|---|---|---|---|
| KING | 10 | 5000 | 1 |
| CLARK | 10 | 2450 | 2 |
| MILLER | 10 | 1300 | 3 |
PARTITION BY deptno를 사용하여 부서별로 순위를 다시 매긴 것을 볼 수 있습니다.
SELECT customer_id, order_date, amount,
SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS cumulative_amount
FROM orders;
ORDER BY는 그룹 내 정렬을 수행하며, 분석 함수의 결과 값에 영향을 줍니다. 예를 들어 누적 합계를 구할 때는 날짜 순으로 정렬하여 계산해야 합니다.
SELECT region, product_name, sales,
RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS region_sales_rank
FROM sales_data;
아래는 PARTITION BY 없이 누적합을 구한 예입니다. 전체 데이터에 대한 누적합이 됩니다.
SELECT ename, sal,
SUM(sal) OVER (ORDER BY sal DESC) AS total_running_sum
FROM emp;
반면 아래는 부서별 누적합을 구한 예입니다.
SELECT deptno, ename, sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal DESC) AS running_sum_by_dept
FROM emp;
| 항목 | 설명 |
|---|---|
| 기능 | 데이터 그룹별 분석 함수 실행 |
| 주로 사용하는 함수 | RANK(), DENSE_RANK(), SUM(), AVG(), ROW_NUMBER() |
| 차이점 | GROUP BY는 집계, PARTITION BY는 행 기반 분석 |
| 실무 활용 | 랭킹, 누적 합계, 보고서 생성 |
| [ORACLE] SUM() 함수 기본 문법부터 실무 활용 팁까지 (0) | 2025.05.31 |
|---|---|
| [ORACLE] ROW_NUMBER() 함수 완벽 가이드 : 순위 매기기 실전 예제로 배우기 (0) | 2025.05.31 |
| [ORACLE] DENSE_RANK() 함수 완전 정복 : 순위 함수 실전 예제로 배우기 (0) | 2025.05.31 |
| [ORACLE] RANK() OVER 함수로 그룹 별 순위 구하기 실습 가이드 (0) | 2025.05.31 |
| [ORACLE] LISTAGG()로 컬럼 값을 한 줄에 나열하는 방법 (0) | 2025.05.31 |