핵심
윈도우 함수는 SELECT 단계에서 계산되므로, WHERE는 그 결과를 아직 모릅니다.

실행 순서를 시간축처럼 보면 이유가 단순합니다. 먼저 행을 고르고 묶은 뒤, 그 결과 집합 위에 순번과 누적값이 붙습니다.

1

FROM

읽을 테이블과 조인 대상을 정합니다.

2

WHERE

필요한 행만 먼저 남깁니다.

3

GROUP BY

행을 그룹으로 묶습니다.

4

HAVING

그룹 단위로 다시 거릅니다.

5

SELECT + 윈도우 함수

여기서 ROW_NUMBER(), 순위, 누적합 같은 새 열이 만들어집니다.

6

DISTINCT

중복 행을 제거합니다.

7

ORDER BY

최종 출력 순서를 정합니다.

8

LIMIT

반환할 범위를 마지막에 자릅니다.

WHERE 시점 rn은 아직 존재하지 않습니다.

WHERE rn <= 3이 실행될 때는 순번을 계산하는 단계가 오지 않았습니다. 그래서 윈도우 함수 결과를 직접 조건식에 넣을 수 없습니다.

SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn FROM employees WHERE rn <= 3 -- 아직 rn 없음