데이터베이스

[SQL] 윈도우 함수란?

삼록이 2025. 10. 22. 18:38

개념

윈도우 함수란?

SELECT 절에서, 그룹 단위가 아닌 '행 단위'로 계산하는 함수.

다시 말해서 윈도우 함수는 특정 기준에 따라 행마다 계산을 수행하는 함수라고 생각하면 된다.

 

아래 GROUP BY를 쓰는 것과 비교해보면 무슨 말인지 정확하게 알게 될 것이다.

 

employees라는 테이블이 있다.

 

부서별 월급합계를 구하려면 아래와 같이 GROUP BY를 사용하면 된다.

SELECT dept, SUM(salary)
FROM employees
GROUP BY dept;

dept라는 그룹단위로 계산을 수행하였으며, 그룹 단위로 합쳐졌기 때문에 아래 결과처럼 행 수가 줄어든다

그런데 원본테이블을 유지한채 옆에만 그냥 본인이 속한 그룹별 월급합계가 추가되기를 원한다면,

즉 아래와 같은 결과가 나오길 원한다면, 이 때 쓸 수 있는 것이 윈도우 함수다.

SELECT
  emp_id,
  dept,
  salary,
  SUM(salary) OVER (PARTITION BY dept) AS dept_total
FROM employees;

문법

SELECT 윈도우 함수명 컬럼명 OVER ( [PARTITION BY 컬럼명] [ORDER BY 컬럼명] [ROWS또는 RANGE절])


예시

윈도우 함수 중에 ROW_NUMBER() 함수가 있다.

이 함수는 지정된 정렬 기준에 따라, 각 행(row)에 고유한 순번(1부터 시작)을 부여하는 윈도우 함수다

 

다시 아래와 같은 테이블이 있다고 가정하고

 

아래와 같이 SQL문을 날리면,

dept라는 부서별로 먼저 그룹을 나누고 그룹내에서 월급 순위를 부여하는 것이다.

SELECT emp_id, 
       dept, 
       salary, 
       ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS dept_row_num
FROM employees

 

여기서 조금 심화버전으로 각 부서별 1등 직원에 대한 데이터만 가지고오고 싶다면

FROM 절에 서브쿼리를 사용하면 된다(*FROM 절에 들어간 서브쿼리를 인라인 뷰(inline view)라고 한다)

 

SELECT * 
FROM (
        SELECT 
        emp_id,
        dept,
        salary, 
        ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn 
	FROM employees )t 
 WHERE rn =1;

이외에도 자주 쓰이는 윈도우 함수는 아래와 같은 함수들이 있다.