본문 바로가기
Database/MSSQL

MSSQL 윈도우 함수(OVER, RANK 등) 사용 예제

by yazasus 2025. 5. 24.
728x90

MSSQL 윈도우 함수 사용법 – OVER, RANK, ROW_NUMBER 실전 예제로 배우기

윈도우 함수(Window Function)는 행 단위가 아닌, 전체 또는 부분 집합의 데이터를 기준으로 계산을 수행하는 고급 SQL 기능입니다.
집계 함수와 달리 각 행을 그대로 유지하면서 집계값을 함께 반환할 수 있어, 순위, 누적합, 이전값/다음값 처리 등에 유용합니다.

1. 기본 구조 – OVER()

윈도우 함수는 OVER() 절과 함께 사용되며, 다음과 같은 기본 구조를 가집니다:


함수명() OVER (
    PARTITION BY ... 
    ORDER BY ...
)

PARTITION BY: 데이터를 그룹핑할 기준
ORDER BY: 정렬 기준 (순위 부여, 누적합 등에 필요)

2. ROW_NUMBER() – 고유 순번 부여


SELECT 
    UserId,
    OrderDate,
    ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY OrderDate) AS OrderSeq
FROM Orders;

→ 각 사용자의 주문에 순번을 부여합니다.

3. RANK() vs DENSE_RANK()

▶ RANK()


SELECT 
    UserId,
    TotalAmount,
    RANK() OVER (ORDER BY TotalAmount DESC) AS RankNo
FROM Orders;

→ 동일한 금액에 같은 순위를 부여하지만, 다음 순위는 건너뜁니다 (예: 1, 1, 3).

▶ DENSE_RANK()


SELECT 
    UserId,
    TotalAmount,
    DENSE_RANK() OVER (ORDER BY TotalAmount DESC) AS DenseRankNo
FROM Orders;

→ 동일 순위가 있어도 순번을 건너뛰지 않습니다 (예: 1, 1, 2).

4. NTILE(n) – 그룹을 N등분


SELECT 
    UserId,
    TotalAmount,
    NTILE(4) OVER (ORDER BY TotalAmount DESC) AS Quartile
FROM Orders;

→ 데이터를 4분위로 나눠 그룹 번호를 지정합니다.

5. LAG(), LEAD() – 이전/다음 행 참조

▶ LAG()


SELECT 
    UserId,
    OrderDate,
    TotalAmount,
    LAG(TotalAmount) OVER (PARTITION BY UserId ORDER BY OrderDate) AS PrevAmount
FROM Orders;

▶ LEAD()


SELECT 
    UserId,
    OrderDate,
    TotalAmount,
    LEAD(TotalAmount) OVER (PARTITION BY UserId ORDER BY OrderDate) AS NextAmount
FROM Orders;

→ 시계열 또는 이력 데이터를 비교할 때 유용합니다.

6. 누적합 구하기 – SUM() OVER()


SELECT 
    UserId,
    OrderDate,
    TotalAmount,
    SUM(TotalAmount) OVER (PARTITION BY UserId ORDER BY OrderDate) AS RunningTotal
FROM Orders;

→ 사용자별로 주문 누적 금액을 계산합니다.

7. 실무 팁 💡

  • 윈도우 함수는 결과 행 수를 유지하면서 계산이 가능하므로, 집계와 상세 조회를 동시에 처리할 수 있습니다.
  • 정렬 기준(ORDER BY)을 명확히 지정하지 않으면 예기치 못한 순서로 계산될 수 있습니다.
  • ROW_NUMBER()는 페이징 처리, 중복 제거, Top N 처리에 자주 사용됩니다.
  • JOIN 없이 이전 행 데이터를 비교할 수 있어 성능 면에서도 장점이 많습니다.

마무리

윈도우 함수는 복잡한 집계, 순위, 비교 연산을 간결하게 처리할 수 있는 강력한 SQL 도구입니다.
실무에서 집계 결과와 개별 데이터를 함께 다뤄야 할 때, 반드시 익혀두어야 할 기능입니다.
OVER 절의 PARTITION과 ORDER BY를 적절히 조합하면, 어떤 구조의 데이터도 유연하게 가공할 수 있습니다.

728x90