개발자이야기/MS-SQL

MSSQL 윈도우 함수 소개 및 예제

퐈니스타일 2023. 8. 13. 09:00

안녕하세요! 오늘은 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의 윈도우 함수는 데이터를 분석하거나 정렬하기에 매우 유용한 도구입니다.

다양한 윈도우 함수를 활용하여 더 효율적인 쿼리 작성을 경험해 보세요!

728x90
반응형