반응형
윈도우 함수(Window Function)란?
SQL에서 윈도우 함수는 데이터베이스의 결과 집합에 대해 행과 행 간의 관계를 분석하거나, 특정 그룹 내에서 계산 작업을 수행할 때 사용하는 함수입니다. 집계 함수와 비슷하지만, 집계 함수와는 달리 행을 그룹화하지 않고도 결과를 반환하면서 계산을 수행합니다.
윈도우 함수는 "윈도우"라는 개념을 기반으로 동작하며, 이 윈도우는 데이터의 특정 범위를 의미합니다.
윈도우 함수의 기본 구조
함수이름(컬럼명) OVER (
[PARTITION BY 분할기준열]
[ORDER BY 정렬기준열]
[ROWS 또는 RANGE 윈도우 크기]
)
주요 요소:
- 함수이름:
- 대표적인 윈도우 함수:
ROW_NUMBER
,RANK
,DENSE_RANK
,NTILE
,SUM
,AVG
,COUNT
,LAG
,LEAD
등.
- 대표적인 윈도우 함수:
- OVER: 윈도우 함수를 정의하는 데 사용.
- PARTITION BY: 데이터를 그룹화하여 각각의 그룹 내에서 연산 수행.
- ORDER BY: 윈도우 내에서 연산을 수행하는 순서를 지정.
- ROWS 또는 RANGE: 윈도우 크기를 지정.
윈도우 함수의 주요 종류와 사용법
1. 순위 관련 함수
- ROW_NUMBER: 각 행에 고유한 순번을 부여.
- RANK: 값이 같을 경우 같은 순위를 부여하고, 다음 순위를 건너뜀.
- DENSE_RANK: 값이 같을 경우 같은 순위를 부여하지만, 다음 순위를 건너뛰지 않음.
- NTILE(N): 데이터 그룹을 N개의 동일한 크기로 나눔.
예제 데이터: 성적
테이블
| 학생ID | 과목 | 점수 |
|--------|-------|------|
| 1 | 수학 | 90 |
| 2 | 영어 | 85 |
| 3 | 수학 | 95 |
| 4 | 영어 | 90 |
예제 쿼리:
SELECT
학생ID,
과목,
점수,
ROW_NUMBER() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS row_number,
RANK() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY 과목 ORDER BY 점수 DESC) AS dense_rank
FROM 성적;
학생ID | 과목 | 점수 | row_number | rank | dense_rank |
---|---|---|---|---|---|
3 | 수학 | 95 | 1 | 1 | 1 |
1 | 수학 | 90 | 2 | 2 | 2 |
4 | 영어 | 90 | 1 | 1 | 1 |
2 | 영어 | 85 | 2 | 2 | 2 |
2. 집계 함수
윈도우 함수와 함께 집계 함수를 사용하면 행을 그룹화하지 않고 계산 결과를 각 행에 반환할 수 있음.
- SUM: 누적 합.
- AVG: 누적 평균.
- COUNT: 누적 개수.
- MIN/MAX: 최소/최대값.
예제 쿼리:
SELECT
학생ID,
과목,
점수,
SUM(점수) OVER (PARTITION BY 과목) AS 과목별_총점,
AVG(점수) OVER (PARTITION BY 과목) AS 과목별_평균점수
FROM 성적;
학생ID | 과목 | 점수 | 과목별_총점 | 과목별_평균점수 |
---|---|---|---|---|
1 | 수학 | 90 | 185 | 92.5 |
3 | 수학 | 95 | 185 | 92.5 |
2 | 영어 | 85 | 175 | 87.5 |
4 | 영어 | 90 | 175 | 87.5 |
3. LAG / LEAD 함수
- LAG(컬럼명): 이전 행의 값을 가져옴.
- LEAD(컬럼명): 다음 행의 값을 가져옴.
예제 쿼리:
SELECT
학생ID,
과목,
점수,
LAG(점수) OVER (PARTITION BY 과목 ORDER BY 점수) AS 이전_점수,
LEAD(점수) OVER (PARTITION BY 과목 ORDER BY 점수) AS 다음_점수
FROM 성적;
학생ID | 과목 | 점수 | 이전_점수 | 다음_점수 |
---|---|---|---|---|
1 | 수학 | 90 | NULL | 95 |
3 | 수학 | 95 | 90 | NULL |
2 | 영어 | 85 | NULL | 90 |
4 | 영어 | 90 | 85 | NULL |
4. 윈도우 범위 지정 (ROWS / RANGE)
윈도우 범위를 명시적으로 지정해 특정 범위에 대해서만 연산.
ROWS
: 물리적 행의 범위 지정.RANGE
: 값 기반으로 범위 지정.
예제 쿼리:
직전 두 행의 합계를 계산:
SELECT
학생ID,
과목,
점수,
SUM(점수) OVER (ORDER BY 점수 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS 직전_2행_합계
FROM 성적;
학생ID | 과목 | 점수 | 직전_2행_합계 |
---|---|---|---|
2 | 영어 | 85 | 85 |
1 | 수학 | 90 | 175 |
4 | 영어 | 90 | 265 |
3 | 수학 | 95 | 280 |
윈도우 함수의 주요 장점
- 행을 그룹화하지 않고도 계산 결과 반환: 데이터의 세부 정보를 유지하며 분석 가능.
- 비교 및 변화량 분석 용이: 이전/다음 행의 값 비교, 누적 합계/평균 계산 등.
- 유연한 범위 설정:
ROWS
와RANGE
를 통해 다양한 계산 범위 지원. - 다양한 데이터 분석: 순위, 그룹별 통계, 시간 흐름에 따른 변화 등.
윈도우 함수와 일반 집계 함수의 차이
특징 | 집계 함수 | 윈도우 함수 |
---|---|---|
행 그룹화 | 데이터 그룹화 후 결과 반환 | 행을 그룹화하지 않고 결과 반환 |
세부 정보 유지 | 세부 정보 손실 | 세부 정보 유지 |
사용 가능 함수 | SUM, AVG, COUNT 등 | SUM, AVG, COUNT, RANK, LAG 등 |
결과 반환 방식 | 그룹당 1개의 결과 반환 | 각 행마다 결과 반환 |
윈도우 함수는 데이터 분석과 비즈니스 인텔리전스에서 필수적인 도구로, 복잡한 데이터 처리와 비교 작업을 간결하게 수행할 수 있습니다! 🚀
반응형
'🖥️ IT, 컴퓨터 > 🏁 SQL・빅쿼리' 카테고리의 다른 글
[SQL] LEAD 함수란? (0) | 2024.11.24 |
---|---|
[SQL] LAG란? (0) | 2024.11.24 |
[SQL] INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN 차이점 (0) | 2024.11.24 |
[SQL] LIKE란? (0) | 2024.11.24 |
[SQL] HAVING 절이란? (0) | 2024.11.24 |
댓글