SQL 마스터 윈도우 함수: 데이터 분석 최적화 팁

발행: (2026년 5월 9일 AM 11:54 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

Cover image for Master Window Function trong SQL: Bí Kíp Tối Ưu Phân Tích Dữ Liệu

데이터와 백엔드 여러분, 안녕하세요! SQL을 다루다 보면 누구나 GROUP BY에 익숙해져 있습니다. GROUP BY는 매우 강력하지만, 치명적인 단점이 하나 있습니다: 행을 “묶어” 버려서 원본 데이터 각 행의 상세 정보를 잃어버린다는 점이죠.

만약 상사가 “각 주문의 상세와 해당 월 전체 매출 합계를 같은 행에 표시해 주세요” 라고 요구한다면? 바로 **Window Function (윈도우 함수)**가 빛을 발합니다!

1. Window Function이란?

Window Function은 현재 행과 관련된 행들의 집합(“윈도우”)에 대해 계산을 수행하지만 반환되는 행 수는 변경하지 않습니다.

기본 구조

SQL이 Window Function을 사용하고 있음을 인식하려면 OVER() 절이 필요합니다. OVER() 안에는 보통 다음이 포함됩니다:

  • PARTITION BY – 데이터를 그룹으로 나눕니다(GROUP BY와 유사하지만 행을 합치지는 않음).
  • ORDER BY – 각 그룹 내에서 데이터를 정렬합니다.
  • ROWS / RANGE – 더 좁은 윈도우 프레임을 정의합니다(예: 가장 최근 3행의 합만 계산).

2. 평면 윈도우 함수 종류

A. 집계 윈도우 함수 (Aggregate Window Functions)

여전히 SUM, AVG, COUNT, MAX, MIN 이지만 OVER()와 함께 사용됩니다.

예시: 연도별 일일 누적 매출 합계 계산

SELECT
    MaDonHang,
    NgayDatHang,
    TongTien,
    SUM(TongTien) OVER (
        PARTITION BY YEAR(NgayDatHang)
        ORDER BY NgayDatHang
    ) AS TongLuyKeNam
FROM DonHang;

B. 순위 윈도우 함수 (Ranking Window Functions)

‘Top N’ 제품이나 우수 직원을 찾는 데 유용합니다.

함수설명
ROW_NUMBER()연속적인 순번 1, 2, 3, …을 부여 (동일값은 무시).
RANK()값이 동일하면 동점 처리하지만 다음 순위를 건너뜀 (예: 1, 2, 2, 4).
DENSE_RANK()값이 동일하면 동점 처리하지만 다음 순위를 건너뛰지 않음 (예: 1, 2, 2, 3).

예시: 카테고리별 베스트 판매 제품 순위 매기기

SELECT
    DanhMuc,
    TenSanPham,
    TongSoLuongBan,
    RANK() OVER (
        PARTITION BY DanhMuc
        ORDER BY TongSoLuongBan DESC
    ) AS HangSanPham
FROM SanPhamBanChay;

C. 값 윈도우 함수 (Value Window Functions)

현재 행을 기준으로 이전 행이나 다음 행의 값을 가져옵니다 – 변동 계산(MoM, YoY)에 매우 유용합니다.

  • LAG() – 이전 행의 값을 가져옵니다.
  • LEAD() – 다음 행의 값을 가져옵니다.

예시: 이번 달 매출을 이전 달 매출과 비교

SELECT
    Thang,
    DoanhSo,
    LAG(DoanhSo, 1, 0) OVER (ORDER BY Thang) AS DoanhSoThangTruoc,
    DoanhSo - LAG(DoanhSo, 1, 0) OVER (ORDER BY Thang) AS ChenhLech
FROM BaoCaoDoanhSo;

3. 성능 최적화 팁

  • 인덱스는 필수PARTITION BYORDER BY에 사용되는 컬럼에 적절한 인덱스가 설정되어 있는지 확인하십시오; 그렇지 않으면 DB가 수동 정렬을 수행해야 하며 리소스를 많이 소모합니다.
  • 너무 넓은 윈도우 프레임 제한 – 실제로 필요하지 않은 경우, 대용량 데이터셋에 UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING을 사용하는 것을 피하십시오.
  • CTE(WITH ... AS)와 결합 – 복잡한 윈도우 함수가 많이 필요할 때, CTE로 분리하면 코드 가독성이 향상되고 DB가 실행 계획을 더 잘 최적화합니다.

Nguồn tham khảo: ITPrep – Hướng dẫn chuyên sâu về Window Function trong SQL

🎯 요약

긴 서브쿼리를 작성하고 실행 속도가 느린 대신, 윈도우 함수는 우아한 구문과 뛰어난 실행 속도를 제공합니다. 데이터 분석 작업이나 백엔드 보고서 처리에 있어 이것은 필수 기술입니다.


추가 탐색: SQL 문제를 연습하고, 쿼리를 최적화하거나 데이터베이스 설계를 배우고 싶다면 ITPrep 블로그를 방문해 오늘 바로 스킬을 업그레이드하세요!

0 조회
Back to Blog

관련 글

더 보기 »

AI를 보다 효과적으로 사용하는 팁

AI를 보다 효과적으로 활용하려는 개발자라면, 실제로 나에게 도움이 되었던 세 가지가 있습니다: AI를 주니어 팀원처럼 대하기 - 컨텍스트 제공, 제약…