LOGICAL ORDER

윈도우 함수는 WHERE에서 바로 필터링할 수 없다

논리적 처리 순서상 윈도우 함수는 WHERE 이후에 계산됩니다. 그래서 결과를 필터링하려면 한 겹 감싸야 합니다.

WHERE 이전
WINDOW 계산
서브쿼리 해결
1FROM / WHERE

대상 행을 먼저 고릅니다. 아직 rn은 없습니다.

2GROUP BY / HAVING

집계가 있으면 이 단계의 결과 행이 만들어집니다.

3WINDOW / SELECT

ROW_NUMBER 같은 윈도우 결과가 붙습니다.

4외부 WHERE

서브쿼리나 CTE 밖에서 rn을 필터링합니다.

-- 불가
WHERE rn <= 3
-- 범용 패턴
SELECT * FROM (
  SELECT ..., ROW_NUMBER() OVER (...) AS rn
) t
WHERE rn <= 3
일부 DBMS의 QUALIFY는 이 단계를 줄여 주지만, 서브쿼리/CTE가 가장 범용적인 방식입니다.