2025-08-29 20:53

Tags: SQL

윈도우 함수

  • ‘현재 행’을 기준으로 관련된 행들의 집합에 대해 계산을 수행하는 함수
  • GROUP BY는 여러 행을 압축하여 보여준다면, 윈도우 함수는 각 행을 유지한 채, 새로운 결과를 새로운 열에 추가
SELECT
    column_name(s),
    WINDOW_FUNCTION_NAME(argument(s)) OVER (
        [PARTITION BY column_name(s)]
        [ORDER BY column_name(s)]
        [ROWS or RANGE BETWEEN start AND end]
    ) AS new_column_name
FROM
    table_name;
  1. PARTITION BY: 창문을 통해 내다볼 ‘그룹’을 나눈다. GROUP BY와 유사하지만, 행을 합치지 않는다. 예를 들어 PARTITION BY department는 부서별로 별개의 창문을 만드는 것과 같다.
  2. ORDER BY: 파티션(그룹) 내에서 어떤 순서로 행을 정렬할지 결정. 순위나 누적 값을 계산할 때 필수적.
  3. ROWS / RANGE (프레임 절): 파티션 내에서 현재 행을 기준으로 계산에 포함할 구체적인 행의 범위를 지정. 예를 들어 ‘현재 행과 이전 2개 행’ 또는 ‘현재 행부터 파티션의 마지막 행까지’와 같이 매우 세밀한 범위 설정이 가능.
함수설명예시 사용 사례
SUM()파티션 내 값들의 합계를 구합니다.월별 매출과 함께 누적 매출 계산
AVG()파티션 내 값들의 평균을 구합니다.직원별 급여와 함께 부서 평균 급여 비교
COUNT()파티션 내 행의 개수를 셉니다.각 게시글과 함께 해당 작성자가 쓴 총 게시글 수 표시
MAX()파티션 내 최댓값을 구합니다.학생별 점수와 함께 해당 반의 최고 점수 표시
MIN()파티션 내 최솟값을 구합니다.제품별 판매가와 함께 해당 카테고리의 최저가 표시
함수설명특징
ROW_NUMBER()파티션 내에서 고유한 순위를 부여합니다. (1, 2, 3, 4, …)동점자가 있어도 무조건 다른 순위를 매깁니다.
RANK()일반적인 순위 방식입니다. (1, 2, 2, 4, …)동점자에게는 같은 순위를 부여하고, 다음 순위는 동점자 수를 건너뛰어 매깁니다.
DENSE_RANK()RANK()와 유사하지만, 순위를 건너뛰지 않습니다. (1, 2, 2, 3, …)동점자가 있어도 다음 순위는 바로 이어집니다.
NTILE(n)파티션의 행들을 n개의 그룹(버킷)으로 나눕니다.상위 25%, 50% 등 백분위수를 계산할 때 유용합니다.
함수설명예시 사용 사례
LAG(col, n, default)현재 행보다 n번째 앞에 있는 행의 col 값을 가져옵니다.어제의 매출과 오늘의 매출을 비교
LEAD(col, n, default)현재 행보다 n번째 뒤에 있는 행의 col 값을 가져옵니다.오늘의 매출과 내일의 예상 매출을 비교
FIRST_VALUE(col)파티션의 첫 번째 행의 col 값을 가져옵니다.각 직원의 급여와 해당 부서에서 가장 먼저 입사한 직원의 급여 비교
LAST_VALUE(col)파티션의 마지막 행의 col 값을 가져옵니다.각 직원의 급여와 해당 부서에서 가장 최근에 입사한 직원의 급여 비교