[TIL] WINDOW + ORDER BY

Hanna Kim·2020년 8월 23일
1

SQL

목록 보기
8/11

Leetcode 185. Department Top Three Salaries


윈도우 함수를 활용해서 풀었는데 여러 문제가 있었다.

일단 두 부서별로 랭킹을 구해야 했다.

그래서 혹시 PARITION BY와 함께 쓰면 되지 않을까 하고 아래와 같이 써봤다.

SELECT DENSE_RANK() OVER (ORDER BY Salary PARTITION BY departmentId)  AS ranking
FROM Employee

오류가 떴다. 그래서 그냥 RANK 함수에선 PARTITION BY가 작동하지 않는다고 결론을 내린채 실망을 안고 두 부서별로 셀렉해서 UNION까지 했다.

물론 그것도 제대로 결과가 나오지 않았다.

이유를 찾기 위해 가장 작은 테이블부터 쿼리를 돌려봤는데, 가장 낮은 Salary를 받는 사람에게 더 높은 랭킹이 주어지고 있었다.

RANK라는 이름에 현혹돼서 당연히 알아서 높은 Salary부터 따져볼 거라는 이상한 착각을 하고 있었다.

그래서 코드에 DESC 조건을 추가해줬다.

SELECT DENSE_RANK() OVER (ORDER BY Salary DESC) 
FROM Employee

그러고 나서도 답이 나오지 않았는데 PARTITION BY에 미련이 남아서 ORDER BY 앞에 적어봤다.

SELECT DENSE_RANK() OVER (PARTITION BY DepartmentID ORDER BY Salary DESC) 
FROM Employee

답이 맞았다.

PARTITION BY가 GROUP BY와 같은 역할을 하니까 ORDER BY 앞에 오는 게 맞는 것 같다.

또 조금은 허무하지만 이번의 A-HA 모먼트도 오래 기억할 수 있을 것 같다.

🥁 윈도우 함수에서 PARTITION BY와 ORDER BY 순서 주의할 것

🥁 윈도우 함수에서 랭크 구할 때 ORDER BY DESC, ASC 확인할 것

profile
쌓으며 배우는 중

0개의 댓글