문제
다음 테이블에서 각 부서별 급여 상위 2명의 순위를 구하려고 할 때, 올바른 SQL은?
EMP 테이블: DEPTNO, ENAME, SAL
① SELECT DEPTNO, ENAME, ROW_NUMBER() OVER(ORDER BY SAL DESC) FROM EMP WHERE ROW_NUMBER() <= 2 ② SELECT DEPTNO, ENAME, RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS RNK FROM EMP WHERE RNK <= 2 ③ SELECT * FROM (SELECT DEPTNO, ENAME, RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS RNK FROM EMP) WHERE RNK <= 2 ④ SELECT DEPTNO, ENAME, DENSE_RANK() OVER(ORDER BY SAL DESC) FROM EMP GROUP BY DEPTNO HAVING COUNT(*) <= 2
정답
3번
해설
③ 서브쿼리를 사용하여 윈도우 함수 결과를 먼저 계산한 후 WHERE 조건을 적용해야 합니다. ① PARTITION BY가 없어 부서별 구분이 안 되고 WHERE절에서 윈도우 함수를 직접 사용할 수 없습니다. ② WHERE절에서 윈도우 함수 별칭을 직접 참조할 수 없습니다. ④ GROUP BY와 윈도우 함수를 잘못 조합했고 부서별 상위 2명을 구하는 로직이 아닙니다.