문제
아래 SQL에서 EMPLOYEE_ID가 7780인 행의 결과로 알맞은 것은?
| EMPLOYEE_ID | SALARY |
|---|---|
| 7780 | 4000 |
| 7781 | 4000 |
| 7782 | 3000 |
| 7783 | 3000 |
| 7784 | 2000 |
SQLSELECT EMPLOYEE_ID, ROW_NUMBER() OVER (ORDER BY SALARY, EMPLOYEE_ID) AS ROW_NUM, RANK() OVER (ORDER BY SALARY) AS RANK_NUM, DENSE_RANK() OVER (ORDER BY SALARY) AS DENSE_RANK_NUM FROM EMPLOYEES;
① 4, 4, 3 ② 3, 3, 3 ③ 4, 4, 4 ④ 3, 4, 3
정답
1번
해설
정답: 1. SALARY 오름차순에서 2000이 1번째, 3000 두 행이 23번째, 4000 두 행이 45번째이다. ROW_NUMBER는 SALARY, EMPLOYEE_ID 기준으로 정렬하므로 7780은 4000 그룹의 첫 번째가 되어 ROW_NUMBER 4, RANK 4, DENSE_RANK 3이다.
오답 풀이
- 1번: ROW_NUMBER 4, RANK 4, DENSE_RANK 3으로 맞다.
- 2번: RANK가 3이 될 수 없다.
- 3번: DENSE_RANK는 4000을 세 번째 distinct 값으로 보므로 3이다.
- 4번: ROW_NUMBER가 3이 될 수 없다.
보충 개념 ROW_NUMBER는 행마다 고유 번호를 부여한다. RANK는 동점 이후 순위를 건너뛰고, DENSE_RANK는 동점 이후 순위를 건너뛰지 않는다. ROW_NUMBER는 동점이 있으면 추가 정렬 기준을 명시해야 결과가 안정적이다.