티스토리 뷰
오라클 OVER (PARTITION BY ...)
오라클에서 OVER (PARTITION BY ...)는 윈도우 함수(Window Function)와 함께 사용되는 핵심 구문입니다. 일반적인 GROUP BY 절과 달리, PARTITION BY는 데이터를 그룹화하지만 원래의 행들을 유지하면서 각 그룹 내에서 집계 또는 순위 계산을 수행할 수 있게 해줍니다.
GROUP BY vs PARTITION BY의 핵심 차이점
-
GROUP BY데이터를 그룹화하고 각 그룹에 대해 하나의 요약된 행을 반환합니다. 그룹 내의 개별 행 데이터는 사라지고 집계된 결과만 남습니다.
SELECT category, SUM(sales_amount) FROM sales_data GROUP BY category; -- 결과: 각 카테고리별 총 매출액 (각 카테고리당 1행) -
PARTITION BY(withOVER)데이터를 논리적인 파티션(그룹)으로 나누지만, 모든 원본 행을 유지합니다. 그리고 각 행에 대해 해당 행이 속한 파티션 내에서 계산된 값을 함께 보여줍니다.
SELECT product, category, sales_amount, SUM(sales_amount) OVER (PARTITION BY category) AS total_sales_per_category FROM sales_data; -- 결과: 각 상품별 정보와 함께 해당 상품이 속한 카테고리의 총 매출액이 모든 행에 표시됩니다.
OVER (PARTITION BY ...)의 작동 방식
- 데이터 분할 (PARTITION BY):
PARTITION BY절에 지정된 컬럼들의 값을 기준으로 전체 결과 집합을 논리적인 파티션으로 나눕니다. 예를 들어,PARTITION BY category라고 하면 'Electronics', 'Clothing' 등category컬럼의 값에 따라 데이터가 분리됩니다. - 윈도우 함수 적용:
OVER절 앞에 오는 윈도우 함수(예:SUM(),AVG(),COUNT(),ROW_NUMBER(),RANK(),LEAD(),LAG()등)는 이 파티션 내에서 작동합니다. - 결과 반환: 각 원본 행에 대해, 해당 행이 속한 파티션 내에서 계산된 결과가 새로운 컬럼으로 추가되어 반환됩니다.
주요 활용 사례
-
그룹별 집계 값 확인 (전체 행 유지)
각 직원의 급여 정보와 함께 해당 직원이 속한 부서의 평균 급여를 함께 보고 싶을 때 유용합니다.
SELECT emp_name, department, salary, AVG(salary) OVER (PARTITION BY department) AS avg_dept_salary FROM employees; -
그룹 내 순위 부여
각 부서 내에서 직원의 급여 순위를 매기거나, 특정 카테고리 내에서 상품의 판매량 순위를 매길 때 사용됩니다.
ROW_NUMBER(),RANK(),DENSE_RANK()와 함께 자주 사용됩니다.SELECT emp_name, department, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank_in_dept FROM employees;ROW_NUMBER(): 파티션 내에서 고유한 일련번호를 부여합니다.RANK(): 같은 값에는 같은 순위를 부여하고, 다음 순위는 건너뜁니다 (예: 1, 2, 2, 4).DENSE_RANK(): 같은 값에는 같은 순위를 부여하고, 다음 순위는 건너뛰지 않습니다 (예: 1, 2, 2, 3).
-
누적 합계 또는 이동 평균
시간이나 특정 기준에 따라 누적 합계 또는 이동 평균을 계산할 때 사용됩니다.
ORDER BY와ROWS BETWEEN ... AND ...또는RANGE BETWEEN ... AND ...와 함께 사용될 수 있습니다.SELECT order_date, customer_id, amount, SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS cumulative_customer_sales FROM orders; -
이전/다음 행의 값 참조
LAG()(이전 행) 또는LEAD()(다음 행) 함수를 사용하여 파티션 내에서 이전 또는 다음 행의 값을 가져올 수 있습니다.SELECT order_date, product, price, LAG(price, 1, 0) OVER (PARTITION BY product ORDER BY order_date) AS previous_price FROM daily_prices;
ORDER BY 절과의 관계
OVER (PARTITION BY ... ORDER BY ...) 에서 ORDER BY 절은 각 파티션 내에서 윈도우 함수가 적용될 순서를 정의합니다. ROW_NUMBER(), RANK(), LAG(), LEAD()와 같은 함수들은 ORDER BY 절이 필수적입니다. SUM(), AVG()와 같은 집계 함수는 ORDER BY 없이도 사용할 수 있지만, ORDER BY를 추가하면 누적 합계나 이동 평균과 같은 특정 순서에 따른 계산을 수행할 수 있습니다.
요약
OVER (PARTITION BY ...)는 Oracle SQL에서 매우 강력한 분석 기능으로, GROUP BY의 한계를 극복하고 원본 데이터를 유지하면서 복잡한 그룹 내 계산을 수행할 수 있도록 해줍니다. 이를 통해 쿼리를 더 간결하고 효율적으로 작성할 수 있습니다.
'DEV > DB' 카테고리의 다른 글
| Merge into 동일 테이블 (3) | 2025.07.29 |
|---|---|
| Merge into (2) | 2025.07.29 |
| DBeaver 성능 저하 문제 해결 (1) | 2025.06.25 |
| Oracle DB 프로시저 글로벌 변수 세션 관리 (0) | 2025.06.13 |
| 오라클 사용자 정의 타입 설명 (0) | 2025.06.11 |
- Total
- Today
- Yesterday
- LILI COFFEE
- 리리 커피
- Powershell
- handdrip
- Coffee
- GitHub
- popup
- db
- 단위변환
- 커피
- partition
- SQL
- MySQL
- Eclipse
- SEQUENCE
- JavaScript
- 스페셜티
- oracle
- BAT
- table
- VBS
- MariaDB
- Filter
- 로스터리
- date
- Between
- backup
- JSP
- dbeaver
- diff
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
