일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- analytics4
- 각데이터베이스별
- JPA
- PostgreSQL
- group by
- SQL
- DBMS
- 티스토리챌린지
- rebase vs merge
- 차이점
- 명령어
- mssql
- 오블완
- 뷰테이블
- docker
- java
- git
- network
- IntelliJ
- oracle
- Javascript
- spring
- 트랜잭션
- 4요소
- 자바
- c#특징
- API
- Python
- mysql
- Today
- Total
hanker
SQL - Window Functions 의 모든 것 (윈도우 함수) 본문
SQL 윈도우 함수(Window Functions)는 데이터를 그룹화하지 않고도 집계 값을 계산하거나 순위를 매길 때 사용된다.
윈도우 함수는 데이터 분석에 강력한 도구를 제공하며, 데이터를 더 세밀하게 처리할 수 있도록 도와준다.
이번 글에서는 윈도우 함수의 정의와 활용 방법을 알아보자!
1. 윈도우 함수란?
윈도우 함수는 쿼리 결과 데이터에서 각 행에 대해 계산을 수행하며, OVER 절과 함께 사용된다.
- 기존의 집계 함수(SUM, AVG 등)와 달리, 그룹화를 하지 않고도 계산할 수 있다.
- 각 행에 대해 범위를 정의하여 계산을 수행한다.
2. 윈도우 함수의 기본 구조
아래 기본 문법으로 사용 방법에 대해서 알아보자.
<윈도우 함수>(컬럼명) OVER ([PARTITION BY 컬럼명] [ORDER BY 컬럼명])
PARTITION BY: 데이터를 특정 기준으로 나눈다.
ORDER BY: 윈도우 내에서 행의 순서를 지정한다.
3. 주요 윈도우 함수 종류
3.1 집계 함수와 함께 사용
윈도우 함수는 SUM, AVG, MIN, MAX, COUNT와 함께 사용할 수 있다.
아래 누적 합계를 계산하는 쿼리를 보자
SELECT
employee_id,
department_id,
salary,
SUM(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS cumulative_salary
FROM employees;
# 결과: 부서별로 직원의 급여 누적 합계를 계산한다.
3.2 순위 함수
- RANK(): 순위를 매기며, 동일한 순위가 있을 경우 건너뛴다.
- DENSE_RANK(): 순위를 매기며, 동일한 순위가 있을 경우 건너뛰지 않는다.
- ROW_NUMBER(): 순서를 매기며 중복이 없다.
아래 순위 계산하는 쿼리로 알아보자
SELECT
employee_id,
department_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_number
FROM employees;
# 결과: 부서별로 급여 순위를 계산한다.
3.3 LEAD와 LAG
- LEAD(): 다음 행의 값을 가져온다.
- LAG(): 이전 행의 값을 가져온다.
아래 이전달 및 다음달 급여 비교 쿼리로 알아보자.
SELECT
employee_id,
department_id,
salary,
LAG(salary) OVER (PARTITION BY department_id ORDER BY salary) AS previous_salary,
LEAD(salary) OVER (PARTITION BY department_id ORDER BY salary) AS next_salary
FROM employees;
# 결과: 각 직원의 이전 급여와 다음 급여를 비교한다.
3.4 FIRST_VALUE와 LAST_VALUE
- FIRST_VALUE(): 윈도우 내 첫 번째 값을 반환한다.
- LAST_VALUE(): 윈도우 내 마지막 값을 반환한다.
아래 첫 번째 및 마지막 급여 쿼리
SELECT
employee_id,
department_id,
salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary) AS first_salary,
LAST_VALUE(salary)
OVER (PARTITION BY department_id ORDER BY salary
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_salary
FROM employees;
# 결과: 부서별로 첫 번째와 마지막 급여를 반환한다.
4. 프레임 정의 (ROWS와 RANGE)
윈도우 함수는 ROWS 또는 RANGE를 사용해 데이터 범위를 세밀하게 지정할 수 있다.
ROWS 예제
SELECT
employee_id,
salary,
SUM(salary) OVER (ORDER BY employee_id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_sum
FROM employees;
# 결과: 현재 행과 이전 두 행의 급여 합계를 계산한다.
SELECT
employee_id,
salary,
SUM(salary) OVER (ORDER BY salary RANGE BETWEEN 1000 PRECEDING AND CURRENT ROW) AS range_sum
FROM employees;
# 결과: 현재 행과 급여 차이가 1000 이하인 모든 행의 급여 합계를 계산한다.
5. 윈도우 함수 활용 사례
5.1 매출 누적 합계
SELECT
sale_date,
product_id,
amount,
SUM(amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS cumulative_sales
FROM sales;
# 결과: 제품별로 날짜 순 매출 누적 합계를 계산한다.
5.2 이동 평균 (Rolling Average)
SELECT
employee_id,
salary,
AVG(salary) OVER (ORDER BY employee_id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_avg
FROM employees;
# 결과: 이전 두 행과 현재 행의 급여 평균을 계산한다.
6. 윈도우 함수와 GROUP BY의 차이
특징 | 윈도우 함수 | GROUP BY |
결과 행 | 원래 행 유지 | 그룹당 하나의 결과 행 반환 |
사용 목적 | 행 단위로 집계 값 계산 | 그룹 전체 집계 값 계산 |
데이터 처리 범위 | PARTITION BY를 사용해 세밀한 제어 가능 | 그룹화된 데이터만 처리 가능 |
SQL 윈도우 함수는 데이터를 더욱 정교하게 처리하고, 분석 업무를 효율적으로 수행하는 데 필수적이다.
충분한 반복 학습으로 습득하거나, 이렇게 예제 코드를 한번 보고 나중에 검색해서 사용하면 된다.
'DATABASE > SQL' 카테고리의 다른 글
SQL - 트랜잭션(Transaction) 가이드 (커밋과 롤백 활용 방법) (0) | 2025.01.06 |
---|---|
SQL - 인덱스(index) 사용법, 종류, 정의 (0) | 2025.01.05 |
SQL - 서브쿼리 사용법 (서브쿼리 활용 방법) (0) | 2025.01.03 |
SQL - 테이블 결합, 데이터 통합의 핵심 JOIN 알아보기 (0) | 2025.01.02 |
SQL - SQL 각 데이터베이스 별 NULL 처리 방법 (MySQL / MSSQL / ORACLE / PostgreSQL) (0) | 2025.01.01 |