대상 행을 먼저 고릅니다. 아직 rn은 없습니다.
LOGICAL ORDER
윈도우 함수는 WHERE에서 바로 필터링할 수 없다
논리적 처리 순서상 윈도우 함수는 WHERE 이후에 계산됩니다. 그래서 결과를 필터링하려면 한 겹 감싸야 합니다.
WHERE 이전
WINDOW 계산
서브쿼리 해결
›
집계가 있으면 이 단계의 결과 행이 만들어집니다.
›
ROW_NUMBER 같은 윈도우 결과가 붙습니다.
›
서브쿼리나 CTE 밖에서 rn을 필터링합니다.
-- 불가 WHERE rn <= 3
-- 범용 패턴 SELECT * FROM ( SELECT ..., ROW_NUMBER() OVER (...) AS rn ) t WHERE rn <= 3
일부 DBMS의 QUALIFY는 이 단계를 줄여 주지만, 서브쿼리/CTE가 가장
범용적인 방식입니다.