순위를 붙이는 세 방식
ROW_NUMBER는 동점이어도 1, 2, 3, 4처럼 고유 번호를 붙여. RANK는 공동 1위 다음을 3위로 건너뛰고, DENSE_RANK는 공동 1위 뒤를 2위로 이어. 목적에 맞는 동점 규칙을 골라.
그룹마다 상위 행을 고른다
PARTITION BY로 그룹을 나누고 번호를 붙인 뒤 WHERE rn <= 3으로 상위 3개를 남길 수 있어. 1·2·2·4와 1·2·2·3처럼 두 순위 함수의 결과 차이를 직접 비교해봐.
CTE는 질의의 단계에 이름을 붙여
WITH로 중간 결과를 이름 붙이면 복잡한 질의를 읽기 쉬운 단계로 나눌 수 있어. PostgreSQL 12부터는 필요에 따라 CTE를 본문 안으로 합칠 수 있고, 강제로 한 번 계산하려면 MATERIALIZED를 쓸 수 있어. 같은 CTE를 여러 번 참조한다면 실행 계획을 확인해 본문에 합치는 편이 나은지, 한 번 계산해 재사용하는 편이 나은지 판단해.