ROWNUM 은 조건을 통과한 순서대로 먼저 붙고, ROW_NUMBER 는 정렬을 마친 뒤에 붙는다.
왜 그런지까지
ROWNUM 은 결과 행이 나올 때마다 1부터 붙는 값이라 ORDER BY 보다 먼저 정해진다. 그래서 'WHERE ROWNUM <= 3 ORDER BY sal DESC' 는 아무 3건을 뽑아 놓고 정렬한 것이지 상위 3건이 아니다.
상위 N 을 뽑으려면 정렬을 마친 결과를 인라인 뷰로 감싸고 바깥에서 ROWNUM 을 걸어야 한다. ROW_NUMBER() OVER(ORDER BY …) 는 정렬 기준을 함수 안에 품고 있어 그런 순서 문제가 없다. 또 ROWNUM 은 'ROWNUM = 2' 같은 조건이 결코 참이 되지 않는다 — 1이 채택되지 않으면 다음 행도 계속 1이기 때문이다.
정렬을 인라인 뷰 안에 넣어야 진짜 상위 3명이 나온다. 바깥의 번호가 어떻게 붙는지 보자.
ROWNUM vs ROW_NUMBER
ROWNUM 은 정렬 전에 붙는 값이고, ROW_NUMBER 는 OVER 안의 정렬을 끝낸 뒤에 붙는다.
ROWNUM = 2 가 안 되는 이유
첫 행이 조건에 걸려 버려지면 ROWNUM 은 그대로 1에 머무르므로 2가 될 기회가 오지 않는다.
넣어 두면 오늘 · 1일 · 3일 · 7일 · 14일 · 30일 간격으로 다시 물어봅니다