본문 바로가기
자격증/SQLD

[SQLD] 4-5: 윈도우 함수 (Window Functions)

by rnasterofmysea 2025. 2. 17.
반응형

 

이전 포스트:

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 등)에 대해 학습했습니다.

윈도우 함수는 순위 계산, 누적 합계, 이전/다음 행 조회 등의 기능을 제공하며, 데이터 분석과 보고서 작성에서 매우 유용하게 활용됩니다.

 

 

 


 

💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.

 

반응형