메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
윈도우 함수는 현재 행과 관련된 행의 집합에 걸쳐 값을 계산합니다. GROUP BY처럼 그 행들을 하나의 출력 행으로 합치지 않습니다. 예전에는 서브쿼리나 애플리케이션 계층의 처리가 필요했던 분석 쿼리를 가능하게 합니다.

윈도우 함수가 GROUP BY와 다른 점

두 번째 쿼리는 주문당 행 1개를 반환하고, 각 행은 그 고객의 합계도 함께 보여줍니다. GROUP BY는 이것을 할 수 없습니다. 개별 행을 제거하기 때문입니다.

OVER 절

모든 윈도우 함수는 윈도우, 즉 계산할 행의 집합을 정의하는 OVER 절을 사용합니다.
빈 OVER()는 윈도우가 결과 집합 전체라는 뜻입니다.

순위 함수

출력 예:

PARTITION BY: 그룹별 순위

결과 집합 전체가 아니라 그룹 안에서 순위를 매기려면 PARTITION BY를 추가하세요:
각 고객의 가장 최근 주문을 얻으려면:

LAG와 LEAD: 인접한 행에 접근하기

LAG는 이전 행에, LEAD는 다음 행에 접근합니다. 셀프 조인 없이 말입니다.
두 함수 모두 선택적 오프셋(기본값 1)과 인접한 행이 없을 때 쓸 기본값을 받습니다:

누적 합계와 이동 평균

프레임, 즉 계산에 포함할 행의 부분 집합을 정의하려면 ROWS BETWEEN을 사용하세요.
흔한 프레임 지정:

자주 묻는 질문

WHERE 절에서 윈도우 함수 결과로 필터링할 수 있나요?

아니요. 윈도우 함수는 WHERE 뒤에 평가됩니다. 윈도우 함수 결과로 필터링하려면, 쿼리를 서브쿼리나 CTE로 감싸세요:

프레임 절에서 ROWS와 RANGE의 차이는 무엇인가요?

ROWS는 물리적인 행을 셉니다. RANGE는 같은 ORDER BY 값을 가진 행을 함께 묶습니다. 대부분의 용도(누적 합계, 이동 평균)에서는 ROWS가 예상한 동작을 줍니다. RANGE는 정렬 열에 같은 값이 있을 때 놀라운 결과를 낼 수 있습니다.

윈도우 함수는 인덱스와 함께 동작하나요?

윈도우 함수는 윈도우 계산 자체에는 인덱스를 사용하지 않지만, 쿼리는 처리할 행을 줄이기 위해 WHERE 절에 여전히 인덱스를 사용할 수 있습니다. 복잡한 윈도우 쿼리는 실행 계획을 이해하기 위해 MySQL의 EXPLAIN 읽기가 도움이 됩니다.

문제 해결

함께 보기