VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
GROUP BY처럼 그 행들을 하나의 출력 행으로 합치지 않습니다. 예전에는 서브쿼리나 애플리케이션 계층의 처리가 필요했던 분석 쿼리를 가능하게 합니다.
윈도우 함수가 GROUP BY와 다른 점
GROUP BY는 이것을 할 수 없습니다. 개별 행을 제거하기 때문입니다.
OVER 절
모든 윈도우 함수는 윈도우, 즉 계산할 행의 집합을 정의하는OVER 절을 사용합니다.
OVER()는 윈도우가 결과 집합 전체라는 뜻입니다.
순위 함수
출력 예:
PARTITION BY: 그룹별 순위
결과 집합 전체가 아니라 그룹 안에서 순위를 매기려면PARTITION BY를 추가하세요:
LAG와 LEAD: 인접한 행에 접근하기
LAG는 이전 행에, LEAD는 다음 행에 접근합니다. 셀프 조인 없이 말입니다.
누적 합계와 이동 평균
프레임, 즉 계산에 포함할 행의 부분 집합을 정의하려면ROWS BETWEEN을 사용하세요.
자주 묻는 질문
WHERE 절에서 윈도우 함수 결과로 필터링할 수 있나요?
아니요. 윈도우 함수는WHERE 뒤에 평가됩니다. 윈도우 함수 결과로 필터링하려면, 쿼리를 서브쿼리나 CTE로 감싸세요:
프레임 절에서 ROWS와 RANGE의 차이는 무엇인가요?
ROWS는 물리적인 행을 셉니다. RANGE는 같은 ORDER BY 값을 가진 행을 함께 묶습니다. 대부분의 용도(누적 합계, 이동 평균)에서는 ROWS가 예상한 동작을 줍니다. RANGE는 정렬 열에 같은 값이 있을 때 놀라운 결과를 낼 수 있습니다.
윈도우 함수는 인덱스와 함께 동작하나요?
윈도우 함수는 윈도우 계산 자체에는 인덱스를 사용하지 않지만, 쿼리는 처리할 행을 줄이기 위해WHERE 절에 여전히 인덱스를 사용할 수 있습니다. 복잡한 윈도우 쿼리는 실행 계획을 이해하기 위해 MySQL의 EXPLAIN 읽기가 도움이 됩니다.
문제 해결
함께 보기
- MySQL CTE가 파생 테이블보다 나은 경우 — 다단계 분석을 위해 윈도우 함수와 흔히 함께 쓰임
- MySQL GROUP BY 성능 — 행을 하나로 합치는 종류의 집계와 그 비용
- MySQL GROUP BY — 이 절 자체에 대한 튜토리얼 레슨