윈도우 함수란?
- SQL 쿼리 내에서 데이터 집합을 세분화하여 각 부분에 대한 계산을 수행하는 함수
- 특정 윈도우 (데이터 내의 부분 집합) 내에서 작동하며 각각의 행에 대해 결과를 반환한다.
- GROUP BY와의 차이
윈도우 함수 | GROUP BY |
행 기준 연산 : 각 행에 대해 연산을 수행하면서 원본 행의 구조를 유지한다. |
그룹기준 연산 : 데이터를 특정의 열의 값에 따라 그룹화, 그룹에 대한 집계 연산을 수행한다. |
다양한 연산 지원 | 단순 집계 연산 제한 |
원본 데이터셋 변경 없음 | 원본 데이터셋을 축소 |
집계와 상세 데이터를 동시에 제공 | 상세 데이터를 제공할 수 없다. |
윈도우 함수의 종류는 아래와 같이 구분지을 수 있다.
1. 순위 매기기
-- 동일한 값이 있을 경우 같은 순위를 부여하고, 다음 순위를 건너뛴다.
RANK() OVER (ORDER BY 컬럼명 ASC/DESC)
-- 동일한 값이 있을 경우 같은 순위를 부여하지만 다음 순위를 건너뛰지 않는다.
DENSE_RANK() OVER (ORDER BY 컬럼명 ASC/DESC)
-- 순위와 상관없이 각 행에 고유한 번호를 붙인다.
ROW_NUMBER() OVER (ORDER BY 컬럼명 ASC/DESC)
2. 값 호출
-- 현재 행을 기준으로 n행 뒤의 값을 가져온다.
LEAD(호출할값이있는컬럼명, n, 찾는행이없을때값) OVER (ORDER BY 컬럼명 ASC/DESC)
-- 현재 행을 기준으로 n행 앞의 값을 가져온다.
LAG(호출할값이있는컬럼명, n, 찾는행이없을때값) OVER (ORDER BY 컬럼명 ASC/DESC)
-- 파티션으로 나누어진 각 윈도우들의 첫번쨰 값을 가져온다.
FIRST_VALUE(호출할값이있는컬럼명) OVER (ORDER BY 컬럼명 ASC/DESC)
-- 파티션으로 나누어진 각 윈도우들의 마지막 값을 가져온다.
LAST_VALUE(호출할값이있는컬럼명) OVER (ORDER BY 컬럼명 ASC/DESC)
3. 집계연산 - COUNT, SUM, AVG, MIN, MAX
윈도우 함수들의 각 옵션은 다음처럼 3가지로 나눌수 있다.
1. PARTITION BY
- 특정 컬럼을 기준으로 데이터를 부분집합으로 분할한다.
- 이 부분집합들은 윈도우 함수의 계산 범위를 지정하고, 각 부분집합 내에서 독립적으로 함수가 계산된다.
- 사용 형태
함수() OVER (PARTITION BY 컬럼명1, 컬럼명2, ...)
-- 예시
COUNT(*) OVER (PARTITION BY customer_id)
2. ORDER BY
- PARTITION BY 뒤에 오는 옵션, 각 부분집합 내에서 데이터 행들의 정렬 순서를 지정
- 순위나 누적 합계 등의 결과에 영향을 준다.
- 데이터를 정렬기준이 될 컬럼명에 따라 정렬한 다음 그 순서대로 윈도우 함수가 계산되게끔 한다.
- 사용 형태
사용함수() OVER (PARTITION BY 분할기준컬럼명 ORDER BY 정렬기준컬럼명
COUNT(*) OVER (PARTITION BY customer_id ORDER BY rental_date)
3. ROWS / RANGE
- ORDER BY와 함꼐 사용되어, 윈도우 함수가 특정 범위내에서 데이터를 계산하도록 지정한다.
- ROWS 는 물리적 행의 위치를 기준으로 범위를 정한다.
- 각 행을 고유하게 취급하며, 정렬된 순서에 따라 정확하게 해당위치의 행들만 포함한다.
- RANGE는 정렬 키의 값에 따라 범위를 정한다.
- 값이 중복되는 경우, 그 값에 해당하는 모든 행을 같은 그룹으로 간주한다.
- 예를 들어, RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 라면 시작부터 현재 행까지의 데이터를 말한다.
UNBOUNDED PRECEDING | 파티션의 첫 행부터 시작 |
UNBOUNDED FOLLOWING | 파티션의 마지막 행까지 |
CURRENT ROW | 현재 행 포함 |
n PRECEDING/FOLLOWING | 현재 행에서 n행 앞이나 뒤 |