[MySQL] 윈도우 함수

szlee·2024년 10월 20일
0

MySQL

목록 보기
10/16

MySQL에서 윈도우 함수(Window Function)는 집계 함수와 비슷하지만, 결과를 그룹화하지 않고도 개별 행에 대한 연산을 수행하는 함수입니다. 즉, 윈도우 함수는 행을 그룹화하지 않고, 데이터의 특정 범위(윈도우)를 지정하여 그 범위 내에서 연산을 수행할 수 있습니다.

윈도우 함수는 행을 그룹화한 후에도 각 행을 그대로 유지하면서 집계 값이나 순위를 계산하는 데 유용하며, 분석 쿼리나 데이터 보고서 작성 시 강력한 도구로 사용됩니다.

윈도우 함수의 기본 구조

윈도우_함수(컬럼) OVER (
    [PARTITION BY 컬럼]  -- 그룹을 나누는 기준 (선택 사항)
    [ORDER BY 컬럼]      -- 정렬 기준 (선택 사항)
    [ROWS | RANGE BETWEEN] -- 윈도우 범위 (선택 사항)
)

주요 구성 요소:

  • 윈도우 함수: 집계 함수와 유사한 계산을 수행하는 함수 (SUM(), AVG(), COUNT(), ROW_NUMBER(), RANK(), LEAD(), LAG() 등).
  • PARTITION BY: 데이터의 범위를 그룹화할 때 사용. 그룹별로 윈도우 연산을 수행합니다.
  • ORDER BY: 윈도우 함수의 결과를 계산하기 전에 정렬할 기준을 지정합니다.
  • ROWS | RANGE: 윈도우 내에서 특정 범위 또는 상대적인 범위 설정. 주로 사용하지 않으면 전체 범위를 의미합니다.



예시: 주요 윈도우 함수

ROW_NUMBER()

: 각 행에 대해 순번을 부여하는 함수

SELECT employee_name, salary,
       ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;
  • 이 쿼리는 급여(salary)를 기준으로 각 직원에게 순위를 부여합니다.
  • ROW_NUMBER()는 같은 값이 있더라도 순번을 순차적으로 부여합니다.

결과 예시:

employee_namesalaryrank
John800001
Mary750002
Bob700003

RANK()

: 동일한 값이 있을 때 동일한 순위를 부여하는 함수

SELECT employee_name, salary,
       RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
  • 급여가 같은 경우 동일한 순위를 부여합니다.
  • RANK()는 같은 값에 동일한 순위를 부여하고, 그 뒤의 순위는 그만큼 건너뜁니다.

결과 예시:

employee_namesalaryrank
John800001
Mary750002
Bob750002
Alice700004

DENSE_RANK()

: 동일한 값이 있을 때 동일한 순위를 부여하지만, 그 뒤의 순위를 건너뛰지 않는 함수

SELECT employee_name, salary,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
  • DENSE_RANK()는 같은 값에 동일한 순위를 부여하지만, 그 뒤의 순위는 건너뛰지 않습니다.

결과 예시:

employee_namesalaryrank
John800001
Mary750002
Bob750002
Alice700003


LEAD()

: 다음 행의 값을 반환하는 함수

SELECT employee_name, salary,
       LEAD(salary, 1) OVER (ORDER BY salary) AS next_salary
FROM employees;
  • LEAD()는 지정된 행 이후의 값을 반환합니다. 이 예시에서는 다음 행의 급여(salary)를 반환합니다.

결과 예시:

employee_namesalarynext_salary
Alice7000075000
Bob7500080000
John80000NULL

LAG()

: 이전 행의 값을 반환하는 함수

SELECT employee_name, salary,
       LAG(salary, 1) OVER (ORDER BY salary) AS prev_salary
FROM employees;
  • LAG()는 지정된 행 이전의 값을 반환합니다. 이 예시에서는 이전 행의 급여를 반환합니다.

결과 예시:

employee_namesalaryprev_salary
Alice70000NULL
Bob7500070000
John8000075000


윈도우 함수와 GROUP BY의 차이점

GROUP BY는 데이터 그룹화 후 하나의 결과만 반환하는 반면, 윈도우 함수는 그룹화하지 않고도 각 행별로 집계 값을 계산하여 반환합니다.
윈도우 함수는 그룹화 없이 개별 행을 그대로 유지하면서도 집계 및 분석을 수행할 수 있습니다.

윈도우 함수의 사용 시나리오

  • 순위 계산: ROW_NUMBER(), RANK(), DENSE_RANK() 등을 이용하여 데이터를 순위별로 정렬할 때.
  • 이전/다음 행 값 참조: LEAD()와 LAG()를 사용하여 각 행에 대해 이전 또는 다음 행의 데이터를 참조할 때.
  • 누적 합계: SUM()을 사용하여 누적 합계 또는 가중치 계산을 수행할 때.
  • 이동 평균: 데이터를 특정 기간 또는 범위 내에서 평균을 계산하고자 할 때.

요약

  • 윈도우 함수는 행을 그룹화하지 않고도 각 행에 대해 분석을 수행할 수 있는 강력한 도구입니다.
  • PARTITION BY, ORDER BY, ROWS 등의 절을 통해 데이터의 범위를 정의하고 그 범위 내에서 연산을 수행합니다.
  • MySQL에서 윈도우 함수는 순위 계산, 누적 합계, 이동 평균 등 다양한 분석에 활용될 수 있습니다.
profile
🌱

0개의 댓글