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
'Database > MSSQL' 카테고리의 다른 글
| MSSQL 날짜 및 시간 함수(GETDATE, DATEADD 등) 활용법 (0) | 2025.05.26 |
|---|---|
| MSSQL 자주 사용하는 문자열 함수(LEN, SUBSTRING 등) 정리 (0) | 2025.05.25 |
| MSSQL 서브쿼리(Subquery)와 CTE(Common Table Expression) 활용 (0) | 2025.05.23 |
| MSSQL GROUP BY와 HAVING 절의 차이점과 사용법 (0) | 2025.05.22 |
| MSSQL INSERT, UPDATE, DELETE 문 사용법 (0) | 2025.05.21 |