이전 포스트:
2025.02.16 - [자격증/SQLD] - [SQLD] 4-4 : 그룹(소계) 함수 및 집계 연산자
[SQLD] 4-4 : 그룹(소계) 함수 및 집계 연산자
2025.02.16 - [자격증/SQLD] - [SQLD] 4-3: 집합 연산자 (Set Operators) 0. 집계 함수와 소계(총계) 함수 개념1️⃣ 집계 함수 (Aggregate Functions)GROUP BY와 함께 사용하여 그룹별 데이터를 집계하는 함수.데이터의
rnasterofmysea.tistory.com
SQLD Chapter 4-5: 윈도우 함수 (Window Functions)
1. 윈도우 함수(Window Functions)란?
윈도우 함수(Window Functions)는 행(row) 단위의 연산을 수행하면서도, 그룹 함수와 달리 각 행의 개별 값을 유지하는 함수입니다. 즉, 특정 그룹 내에서 순위 계산, 누적 합계, 이동 평균 등을 계산하는 데 사용됩니다.
1.1 윈도우 함수의 특징
- GROUP BY 없이도 집계 연산 가능: 특정 그룹 내에서 연산을 수행하면서 개별 행을 유지
- OVER() 절과 함께 사용: 윈도우 함수는 OVER() 절을 사용하여 연산 범위를 지정
- PARTITION BY와 ORDER BY 활용: 데이터를 특정 그룹으로 나누거나 정렬한 상태에서 연산 수행 가능
1.2 시험에 자주 나오는 내용
- RANK() - 동일 순위 발생, 다음 순위 건너뜀
- DENSE_RANK() - 동일 순위 발생, 다음 순위 건너뛰지 않음
- ROW_NUMBER() - 무조건 연속된 순위 부여 다음 순위 건너뛰지 않음
- LAG() - 이전 행 값 참조
- LEAD() - 다음 행 값 참조
2. 윈도우 함수의 기본 구조
윈도우 함수는 다음과 같은 기본 구조를 가집니다.
SELECT 컬럼명,
윈도우함수() OVER(PARTITION BY 그룹컬럼 ORDER BY 정렬컬럼) AS 별칭
FROM 테이블명;
- PARTITION BY: 그룹을 나누는 역할 (선택사항)
- ORDER BY: 연산을 수행할 순서를 정함
3. 주요 윈도우 함수 및 예제
윈도우 함수는 순위 함수(RANK, DENSE_RANK, ROW_NUMBER), 집계 함수(SUM, AVG, COUNT), 이전/다음 행 참조 함수(LAG, LEAD) 등으로 나뉩니다.
3.1 순위 함수 (Ranking Functions)
EMPLOYEES 테이블
EMPLOYEE_ID | EMPLOYEE_NAME | DEPARTMENT_ID | SALARY |
1 | 홍길동 | 10 | 6000 |
2 | 김철수 | 10 | 5000 |
3 | 이영희 | 20 | 7000 |
4 | 박민수 | 20 | 8000 |
5 | 최민호 | 20 | 7000 |
(1) RANK() - 동일 순위 발생, 다음 순위 건너뜀
SELECT EMPLOYEE_NAME, SALARY,
RANK() OVER (ORDER BY SALARY DESC) AS RANKING
FROM EMPLOYEES;
결과
EMPLOYEE_NAME | SALARY | RANKING |
박민수 | 8000 | 1 |
이영희 | 7000 | 2 |
최민호 | 7000 | 2 |
홍길동 | 6000 | 4 |
김철수 | 5000 | 5 |
✅ 설명: 동일한 값이 있으면 동일 순위를 부여하고, 다음 순위는 건너뜀
(2) DENSE_RANK() - 동일 순위 발생, 다음 순위 건너뛰지 않음
SELECT EMPLOYEE_NAME, SALARY,
DENSE_RANK() OVER (ORDER BY SALARY DESC) AS RANKING
FROM EMPLOYEES;
결과
EMPLOYEE_NAME | SALARY | RANKING |
박민수 | 8000 | 1 |
이영희 | 7000 | 2 |
최민호 | 7000 | 2 |
홍길동 | 6000 | 3 |
김철수 | 5000 | 4 |
✅ 설명: 동일한 값이 있으면 동일 순위를 부여하되, 다음 순위를 건너뛰지 않음
(3) ROW_NUMBER() - 무조건 연속된 순위 부여
SELECT EMPLOYEE_NAME, SALARY,
ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS ROW_NUM
FROM EMPLOYEES;
결과
EMPLOYEE_NAME | SALARY | ROW_NUM |
박민수 | 8000 | 1 |
이영희 | 7000 | 2 |
최민호 | 7000 | 3 |
홍길동 | 6000 | 4 |
김철수 | 5000 | 5 |
✅ 설명: 동일한 값이 있어도 무조건 연속된 순위를 부여함
3.2 집계 함수 (Aggregate Functions with OVER())
윈도우 함수는 일반적인 집계 함수(SUM, AVG, COUNT)와 함께 사용할 수도 있습니다.
(4) SUM() - 부서별 누적 합계
EMPLOYEES 테이블
EMPLOYEE_ID | EMPLOYEE_NAME | DEPARTMENT_ID | SALARY |
1 | 홍길동 | 10 | 6000 |
2 | 김철수 | 10 | 5000 |
3 | 이영희 | 20 | 7000 |
4 | 박민수 | 20 | 8000 |
5 | 최민호 | 20 | 7000 |
SELECT EMPLOYEE_NAME, DEPARTMENT_ID, SALARY,
SUM(SALARY) OVER (PARTITION BY DEPARTMENT_ID) AS TOTAL_SALARY
FROM EMPLOYEES;
결과
EMPLOYEE_NAME | DEPARTMENT_ID | SALARY | TOTAL_SALARY |
홍길동 | 10 | 6000 | 11000 |
김철수 | 10 | 5000 | 11000 |
이영희 | 20 | 7000 | 22000 |
박민수 | 20 | 8000 | 22000 |
최민호 | 20 | 7000 | 22000 |
✅ 설명: 같은 부서(DEPARTMENT_ID) 내에서 급여 합계를 계산하여 출력
3.3 이전/다음 행 참조 함수 (LAG, LEAD)
EMPLOYEES 테이블
EMPLOYEE_ID | EMPLOYEE_NAME | DEPARTMENT_ID | SALARY |
1 | 홍길동 | 10 | 6000 |
2 | 김철수 | 10 | 5000 |
3 | 이영희 | 20 | 7000 |
4 | 박민수 | 20 | 8000 |
5 | 최민호 | 20 | 7000 |
(5) LAG() - 이전 행 값 참조
SELECT EMPLOYEE_NAME, SALARY,
LAG(SALARY, 1, 0) OVER (ORDER BY SALARY DESC) AS PREV_SALARY
FROM EMPLOYEES;
결과
EMPLOYEE_NAME | SALARY | PREV_SALARY |
박민수 | 8000 | 0 |
이영희 | 7000 | 8000 |
최민호 | 7000 | 7000 |
홍길동 | 6000 | 7000 |
김철수 | 5000 | 6000 |
✅ 설명: 현재 행에서 이전 행의 급여(SALARY) 값을 가져옴
(6) LEAD() - 다음 행 값 참조
SELECT EMPLOYEE_NAME, SALARY,
LEAD(SALARY, 1, 0) OVER (ORDER BY SALARY DESC) AS NEXT_SALARY
FROM EMPLOYEES;
결과
EMPLOYEE_NAME | SALARY | NEXT_SALARY |
박민수 | 8000 | 7000 |
이영희 | 7000 | 7000 |
최민호 | 7000 | 6000 |
홍길동 | 6000 | 5000 |
김철수 | 5000 | 0 |
✅ 설명: 현재 행에서 다음 행의 급여(SALARY) 값을 가져옴
4. 마무리
이번 장에서는 윈도우 함수의 개념과 종류(RANK, DENSE_RANK, SUM, LAG, LEAD 등)에 대해 학습했습니다.
윈도우 함수는 순위 계산, 누적 합계, 이전/다음 행 조회 등의 기능을 제공하며, 데이터 분석과 보고서 작성에서 매우 유용하게 활용됩니다.
💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] 4-4 : 그룹(소계) 함수 및 집계 연산자 (0) | 2025.02.17 |
---|---|
[SQLD] 4-3: 집합 연산자 (Set Operators) (0) | 2025.02.17 |
[SQLD] 4-2: 뷰 (View) (0) | 2025.02.17 |
[SQLD] 4-1: 서브쿼리 (Subquery) (0) | 2025.02.17 |
Part 4: SQL 활용 (Advanced SQL Usage) (0) | 2025.02.16 |