MSSQL 윈도우 함수 소개 및 예제
안녕하세요! 오늘은 MSSQL에서 유용하게 사용할 수 있는 윈도우 함수(Window Functions)에 대해 알아보겠습니다.
윈도우 함수는 SELECT문에서 행과 관련된 계산을 수행하기 위해 사용되는 함수로, 데이터를 분석하거나 서로 다른 데이터의 값을 비교할 때 유용하게 사용됩니다.
윈도우 함수란?
윈도우 함수는 일련의 로우(행)에 대해 계산 결과를 반환하는 함수입니다.
주요 윈도우 함수로는
ROW_NUMBER()
RANK()
DENSE_RANK()
NTILE()
LEAD()
LAG()
FIRST_VALUE()
LAST_VALUE()
SUM()
AVG()
MIN()
MAX()
COUNT()
윈도우 함수의 구문은 다음과 같습니다.
<윈도우 함수> ( <식> )
OVER ( [PARTITION BY <열 목록>] [ORDER BY <정렬 기준 열> [ASC | DESC] [ROWS | RANGE <윈도우 프레임 범위>] )
그럼 우리가 배울 윈도우 함수의 동작 방식과 활용 예제를 살펴보도록 합시다.
예제 데이터 생성
다음 예제에서는 아래와 같은 Sales 데이터를 사용합니다.
date | employee | amount |
2021-01-01 | Alice | 1000 |
2021-01-01 | Bob | 1200 |
2021-01-02 | Alice | 900 |
2021-01-02 | Charlie | 1100 |
2021-01-03 | Bob | 500 |
ROW_NUMBER()
ROW_NUMBER() 함수는 결과 집합에 대해 고유한 순서 번호를 생성합니다. 다음 쿼리는 날짜와 판매액을 기준으로 작업에 ROW_NUMBER()를 적용한 예입니다.
SELECT
date,
employee,
amount,
ROW_NUMBER() OVER (ORDER BY date, amount DESC) AS row_num
FROM
Sales;
RANK()와 DENSE_RANK()
RANK() 함수는 결과 집합의 각 로우에 고유한 랭크를 부여합니다. 동점인 경우 동일한 랭크가 부여되며, 동점자가 나온 후의 랭크는 건너뜁니다. 반면 DENSE_RANK() 함수는 동점자가 나온 후에도 연속된 랭크를 부여합니다.
SELECT
date,
employee,
amount,
RANK() OVER (PARTITION BY date ORDER BY amount DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY date ORDER BY amount DESC) AS dense_rank
FROM
Sales;
LEAD()와 LAG()
LEAD() 함수는 현재 로우를 기준으로 다음 로우의 값을 조회하는 데 사용되며, LAG() 함수는 이전 로우의 값을 조회하는 데 사용됩니다.
SELECT
date,
employee,
amount,
LAG(amount) OVER (PARTITION BY employee ORDER BY date) AS prev_amount,
LEAD(amount) OVER (PARTITION BY employee ORDER BY date) AS next_amount
FROM
Sales;
이처럼 MSSQL의 윈도우 함수는 데이터를 분석하거나 정렬하기에 매우 유용한 도구입니다.
다양한 윈도우 함수를 활용하여 더 효율적인 쿼리 작성을 경험해 보세요!