Window Function;
데이터베이스 내에서 특정 행(row)의 값이 전체 데이터셋이나 특정 부분집합(partition)의 다른 행과 비교되거나 연관 지어질 때 유용하게 사용되는 함수
여러 행을 참조하면서도, 각 행의 결과를 반환하기 때문에 일반적인 집계 함수(Aggregate Function)와는 다름
특징
행별 결과 반환: 데이터의 각 행에 대해 계산 결과 반환
PARTITION BY: 데이터를 그룹화하여 그룹 내에서만 연산을 수행
ORDER BY: 그룹 내에서 순서를 지정하여 정렬한 뒤 연산 수행
OVER 절: Window Function의 범위와 동작 정의
주요 Window Function
- RANK(), DENSE_RANK(), ROW_NUMBER()
- 데이터를 정렬한 후 각 행의 순위를 반환
- ROW_NUMBER()은 순서를 단순히 증가
- RANK()와 DENSE_RANK()는 중복된 값이 있을 때 순위 계산 방식이 다름
- SUM(), AVG(), COUNT(), MIN(), MAX()
- 집계 함수와 비슷하지만, 각 행별로 결과를 계산
- LEAD(), LAG()
- 특정 열의 이전(LAG) 또는 다음(LEAD) 값을 참조
- NTILE(n)
- 데이터를 n개의 그룹으로 나누고, 각 행에 그룹 번호를 반환
- FIRST_VALUE(), LAST_VALUE()
- 그룹 내에서 첫 번째(FIRST_VALUE) 또는 마지막(LAST_VALUE) 값을 반환
SELECT column1,
column2,
SUM(column3) OVER (PARTITION BY column1 ORDER BY column2) ASrunning_total
FROM table_name
OVER절
PARTITION BY column1: column1을 기준으로 데이터를 그룹화
ORDER BY column2: coumn2를 기준으로 그룹 내에서 정렬
SUM(column3)
각 행에 대해 column3 값의 누적 합계를 계산
사용예)
1. 순위 매기기
각 department_id 내에서 employee_id의 salary순위 반환
SELECT employee_id,
department_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) rank
FROM employees
2. 누적 합계
각 customer_id의 order_amount를 order_data 순서로 누적 합산한 결과 반환
SELECT order_id,
customer_id,
order_date,
SUM(order_amount) OVER (PARTITION BY customer_id ORDER BY order_date) cumulative_total
FROM orders
3. 이전 값과 비교
각 product_id의 sales_data에서 sales를 참조
SELECT product_id,
sale_date,
sales,
LAG(sales) OVER (PARTITION BY product_id ORDER BY sale_date) previous_sales
FROM sales_data
집계 함수와 차이점
- 집계 함수: 결과를 하나의 값으로 반환
- 예: SUM(column)은 그룹당 하나의 결과만 반환.
- Window Function: 각 행별로 결과를 반환
- 예: SUM(column) OVER ()은 각 행마다 결과를 반환.
*장점
데이터를 분석하거나 시간 흐름에 따라 변화하는 값 추적용이
복잡한 통계 계산 단순화
다른 SQL 쿼리로는 처리하기 어려운 데이터 간 관계 파악
'SQL' 카테고리의 다른 글
SQL - DATE_FORMAT (2) | 2024.12.02 |
---|---|
SQL - Pivot Table (5) | 2024.11.28 |
SQL - 'Not given', NULL다루기 (0) | 2024.11.26 |
SQL - JOIN(필요한 데이터가 서로 다른 테이블에 있을 때) (0) | 2024.11.26 |
SQL - Subquery(여러번의 연산 수행) (2) | 2024.11.24 |