논리 처리 순서

윈도우 함수 계산 순서

윈도우 함수는 입력 행을 줄이고 그룹을 확정한 뒤, 각 행에 결과 값을 붙인다. 그래서 WHERE는 윈도우 별칭을 볼 수 없고, 순위 필터는 CTE나 서브쿼리 같은 바깥 SELECT에서 적용한다.

1
FROM / JOIN 계산 후보 행 집합을 만든다.
원본 컬럼과 조인된 컬럼이 펼쳐진 상태.
테이블 컬럼
2
WHERE 윈도우 계산 전에 행을 줄인다.
비용을 줄이는 자리지만 순위 별칭은 아직 없다.
윈도우 결과 제외
3
GROUP BY / HAVING 집계가 있으면 그룹 행을 확정한다.
원본 행 또는 그룹 행이 윈도우 입력이 된다.
그룹 컬럼, 집계값
4
윈도우 함수 평가 파티션, 정렬, 프레임을 읽어 결과 컬럼을 계산한다.
각 행에 순위, 직전값 같은 새 값이 생긴다.
윈도우 결과 생성
5
SELECT 계산 결과를 별칭으로 노출한다.
바깥 쿼리가 참조할 수 있는 결과 테이블이 된다.
별칭 사용 가능
6
ORDER BY / LIMIT 최종 표시 순서와 출력 개수를 정한다.
OVER 안의 ORDER BY와 목적이 다르다.
결과 컬럼
행 상태 변화

후보 행을 줄인 뒤 순위 값을 붙인다

12 JOIN 결과
7 WHERE 통과
7 + 순위 OVER 계산
3 바깥 필터
WHERE
입력 행 축소
OVER
윈도우 결과 계산
바깥
순위 조건 적용

순위를 매길 모집단을 줄여도 되는 조건만 안쪽 WHERE에 두고, 윈도우 결과 조건은 바깥 SELECT로 넘긴다.

필터링 위치

윈도우 별칭은 생성된 뒤에 필터링한다

실패
SELECT
  employee_id,
  RANK() OVER (
    PARTITION BY dept_id
    ORDER BY total DESC
  ) AS dept_rank
FROM employees
WHERE active = true
  AND dept_rank <= 3
가능
WITH ranked AS (
  SELECT
    employee_id,
    RANK() OVER (
      PARTITION BY dept_id
      ORDER BY total DESC
    ) AS dept_rank
  FROM employees
  WHERE active = true
)
SELECT *
FROM ranked
WHERE dept_rank <= 3
1
입력 행 축소 기본 조건은 안쪽 WHERE에서 먼저 줄인다.
2
별칭 필터 순위·이전값 조건은 CTE나 서브쿼리 밖에서 건다.
3
정렬 분리 OVER 안 정렬은 계산용, 바깥 정렬은 표시용이다.