Window Function 1 - 집계함수

Ryan·2025년 1월 15일

SQL/Python 분석

목록 보기
56/94

1. Window Function(윈도우 함수)란?

  1. 집계 결과를 기존 데이터(각 행)에 추가해 보여줌
    • GROUP BY를 쓰면 결과가 “그룹별로 단 1행”으로 요약되지만,
    • Window 함수는 각 행을 모두 유지한 채로 추가 열(Column)로 집계 결과를 볼 수 있습니다.
  2. 합계, 평균, 순위 매기기, 순서 조작 등
    • 대표적인 예시: SUM(), AVG(), COUNT(), RANK(), ROW_NUMBER(), LAG()/LEAD()
    • OVER (PARTITION BY ~ ORDER BY ~) 구문을 통해 파티션(그룹화 기준)과 정렬 기준을 지정할 수 있습니다.
  3. 결과 건수가 줄어들지 않음
    • GROUP BY는 그룹으로 묶이고 행 수가 줄어드는 반면,
    • Window 함수는 원본 행 개수 그대로 반환하며, 집계/순위 정보를 추가 컬럼 형태로 함께 제공합니다.

예시 문법:

sql
코드 복사
SELECT
  WINDOW_FUNCTION(컬럼)
    OVER (
      PARTITION BY 기준컬럼1, 기준컬럼2
      ORDER BY 정렬기준컬럼
    ) AS 별칭
FROM 테이블;

2. Window 함수 vs. GROUP BY 비교

Window 함수와 Group By 비교
  • GROUP BY
    • 해당 컬럼들로 묶은 뒤 하나의 결과 행(집계)으로 나타냄 → 행의 개수가 줄어듦
    • 예: SELECT JobLevel, COUNT(*) FROM table GROUP BY JobLevel;
  • Window 함수
    • 집계값을 각 행마다 표시 → 행의 개수는 그대로 유지
    • 예: SELECT JobLevel, COUNT(*) OVER (PARTITION BY JobLevel) FROM table; → 동일한 JobLevel을 가진 행 각각에 전체 COUNT 결과가 표시

둘 다 “집계 함수”를 쓰지만, 집계 결과 표시 방식이 다르다는 점을 꼭 구분해야 합니다.


3. Window 함수 예시 살펴보기

아래 예시는 특정 HR 데이터에서 JobLevel, PerformanceRating 별로 각각 몇 명인지(count) 확인하고, 그 결과를 다시 다른 기준으로 합산하는 윈도우 함수를 사용한 사례입니다.

3-1. 기본 집계 (GROUP BY) + Window Function

sql
코드 복사
SELECT
    JobLevel,
    PerformanceRating,
    COUNT(hn.EmployeeNumber) AS hc,
    /* 윈도우 함수 예시 1: JobLevel 기준으로 count 누적 합산 */
    SUM(COUNT(hn.EmployeeNumber))
      OVER (PARTITION BY JobLevel) AS hc_job_level,
    /* 윈도우 함수 예시 2: PerformanceRating 기준으로 count 누적 합산 */
    SUM(COUNT(hn.EmployeeNumber))
      OVER (PARTITION BY PerformanceRating) AS hc_perform_level
FROM hr.hr_number hn
LEFT JOIN hr.hr_cate hc
       ON hn.EmployeeNumber = hc.EmployeeNumber
WHERE Attrition = 'No'
GROUP BY 1, 2
ORDER BY 1, 2;

쿼리 해석:

  • COUNT(hn.EmployeeNumber) AS hc: (JobLevel, PerformanceRating) 조합별 인원수
  • SUM(COUNT(hn.EmployeeNumber)) OVER (PARTITION BY JobLevel) AS hc_job_level
    • PARTITION BY JobLevel → JobLevel이 같은 모든 행을 하나의 파티션(그룹)으로 보고, 그 안에 있는 count 결과를 합산
    • 즉, JobLevel이 1인 (PerformanceRating=1,2,3,4…) 모든 행들의 hc를 합쳐 JobLevel=1의 전체 인원을 한 행 한 행마다 보여줌
  • SUM(COUNT(hn.EmployeeNumber)) OVER (PARTITION BY PerformanceRating) AS hc_perform_level
    • PerformanceRating이 같은 행들을 묶어서, 그 count를 합산
    • 즉, PerformanceRating=3인 사람들의 총합을 각 행에 표기

결과 예시:

JobLevelPerformanceRatinghchc_job_levelhc_perform_level
134001044408
14611044189
23408482408
2474482189
33157186408
3429186189
...............
  • hc_job_level: JobLevel별 총합이 각 행마다 동일하게 표시
  • hc_perform_level: PerformanceRating별 총합이 각 행마다 동일하게 표시

이처럼 Window 함수를 적용하면, 한 번의 GROUP BY 결과를 여러 파티션 기준으로 추가 집계하여 원본과 같은 행 수로 보여줄 수 있습니다.


4. Window 함수의 다양한 활용

  1. 순위(RANK, DENSE_RANK, ROW_NUMBER)
    • 특정 컬럼으로 정렬해 상위/하위 순위를 매길 때 유용
    • 예: 매출액 상위 5위, 시험 성적 1등부터 n등까지
  2. 누적 합계(RUNNING TOTAL)
    • SUM(컬럼) OVER (ORDER BY 날짜 ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 형태로 과거부터 현재까지 누적 합계를 구할 수 있음
  3. 이전/다음 행 참조 (LAG, LEAD)
    • 이전 행의 값을 현재 행에서 참조하거나, 다음 행의 값을 확인 가능 → 전월 대비 증감, 이전 행과 비교 등
  4. PARTITION BY 여러 컬럼
    • PARTITION BY 절에 여러 컬럼을 넣어 세분화된 그룹(파티션)을 지정 가능. 예: PARTITION BY Region, ProductCategory

5. Group By vs. Window Function 정리

구분GROUP BYWindow Function (OVER)
핵심 특징그룹별로 요약 → 행 개수 줄어듦기존 행 유지 + 집계 결과를 추가 열로 표시
집계 결과 표시그룹별 1행각 행마다 표시 (파티션 기준 동등한 결과 공유)
사용 구문SELECT 컬럼, 집계함수() FROM ~ GROUP BY 컬럼SELECT 컬럼, 집계함수() OVER (PARTITION BY ~ ORDER BY ~) FROM ~
대표적 활용단순 요약 통계 (ex. 부서별 인원수, 국가별 매출)RANK, 누적 합계, 이전/다음 행 참조, 파티션별 전체집계와 함께 표시 등
행 개수그룹화로 인해 ‘집계 결과만’ 남음원본 행 수 변하지 않음
  • GROUP BY로만 해결하던 것을 Window 함수를 통해 더 정교한 분석이나 동적 순위/누적을 구현할 수 있습니다.

6. 마무리

  • Window 함수는 SQL에서 ‘분석(Analytics) 용도’로 강력하게 활용되는 기능입니다.
  • GROUP BY와 달리 결과가 요약되지 않고, 각 행마다 집계나 순위 등의 정보를 추가로 보여준다는 점이 가장 큰 차이입니다.
  • 마치 Excel에서 피벗 테이블서식(조건부 수식, 누적 계산)을 동시에 사용한다고 생각하면 이해하기 쉽습니다.
  • 주로 PARTITION BY(파티션 나누는 기준)와 ORDER BY(정렬, 순서 기준) 절을 조합해 쓰며, DBMS마다 미묘한 문법 차이는 있을 수 있습니다.

이처럼 Window 함수는 데이터를 더 깊이 분석하거나, 순위 매기기/누적합/이전 행 비교 등을 손쉽게 할 수 있게 해 줍니다.

0개의 댓글