리트코드 SQL 문제 풀이
Employee Table : id | name | salary | departmentId
Department Table : id | nameA company's executives are interested in seeing who earns the most money in each of the company's departments. A high earner in a department is an employee who has a salary in the top three unique salaries for that department.
Write a solution to find the employees who are high earners in each of the departments.
Return the result table in any order.
The result format is in the following example.
WITH CTE AS ( SELECT D.name AS Department, E.name AS Employee, E.salary AS Salary, DENSE_RANK() OVER(PARTITION BY D.name ORDER BY E.salary DESC) AS ranking FROM Employee AS E JOIN Department AS D ON E.departmentId = D.id ) SELECT Department, Employee, Salary FROM CTE WHERE ranking < 4;
문제 풀이의 핵심은 Ranking 함수를 잘 사용할 줄 아는가이다.
흔히 알고 있는 순위함수란, 결과에 순번을 매기는 것을 의미하고 비집계함수들 중 RANK, NTILE, DENSE_RANK, ROW_NUMBER 등이 존재한다.순위를 매기는 범주에는 PARTITION BY 와 ORDER BY가 존재하는데, 정의는 다음과 같다.
- PARTITION BY : 동일 그룹으로 묶어줄 컬럼명 지정 시 사용
- ORDER BY : 파티션 정의에 지정된 컬럼에 대해 정렬을 수행할 때 활용.
또한, 비집계함수 들에 대해 살펴보면 다음과 같다.
- RANK() : 동일 값 포함하여 다음 숫자 산정. EX) 1-2-2-4
- DENSE_RANK() : 동일 값 포함하지 않고 다음 숫자 산정 EX) 1-2-2-3
- ROW_NUMBER() : 값이 같더라도 순위는 상승 EX) 1-2-3-4
- NTILE(PARTITION 수) : 파티션 수만큼 등급을 나누어 각 등급을 부여 EX) 특정 그룹 1, 특정 그룹 2
따라서, 부서별 순위를 매길 시에는 다음과 같이 사용한다.
SELECT DENSE_RANK() OVER(PARTITION BY 범위 ORDER BY 정렬기준할컬럼 ASC OR DESC) AS 지정할 컬럼명 FROM 테이블명
이와 관련하여, 아래 사이트를 참고하면 좋다
https://jie0025.tistory.com/85
정보 제공해주셔서 감사합니다 :)