SQL/LeetCode&HackerRank

[MYSQL] LeetCode 184, 185 - Window Function 사용 풀이

oatmeal 2023. 5. 14. 16:17

note: MySQL 8.0 버전 이상부터 윈도우 함수를 지원한다.

#184

문제 출처: https://leetcode.com/problems/department-highest-salary/

 

문제: 부서별 가장 높은 샐러리 찾기 

 

풀이:

 

- MAX

SELECT D.NAME AS DEPARTMENT
     , E.NAME AS EMPLOYEE
     , E.MAX_SALARY AS SALARY
FROM DEPARTMENT D
     JOIN (
     SELECT NAME
          , SALARY
          , DEPARTMENTID
          , MAX(SALARY) OVER (PARTITION BY DEPARTMENTID) AS MAX_SALARY
     FROM EMPLOYEE
     ) E ON D.ID = E.DEPARTMENTID
WHERE E.SALARY = E.MAX_SALARY

 

가장 높은 급여를 찾을 때 MAX 대신 RANK나 DENSE_RANK를 사용할 수도 있다.

SELECT D.NAME AS DEPARTMENT
     , E.NAME AS EMPLOYEE
     , E.SALARY
FROM DEPARTMENT D
     JOIN (
     SELECT NAME
          , SALARY
          , DEPARTMENTID
          , RANK() OVER (PARTITION BY DEPARTMENTID ORDER BY SALARY DESC) AS R 
            -- RANK() <-> DENSE_RANK()
     FROM EMPLOYEE
     ) E ON D.ID = E.DEPARTMENTID
WHERE R = 1

일반 랭크와 덴스 랭크의 차이는 공동 순위가 있을 때 다음 순위가 공동 순위 만큼 밀리느냐 아니냐이기 때문에

1등 값을 찾는 이 문제에서는 사용 방법에 차이가 없다!

 

#185

문제 출처: https://leetcode.com/problems/department-top-three-salaries/

 

문제: 부서별 상위 샐러리 3개 찾기

 

풀이:

SELECT DEPARTMENT
     , EMPLOYEE
     , SALARY
FROM (
     SELECT D.NAME AS DEPARTMENT
          , E.NAME AS EMPLOYEE
          , E.SALARY
          , DENSE_RANK() OVER (PARTITION BY DEPARTMENTID ORDER BY SALARY DESC) AS R
     FROM EMPLOYEE E
          JOIN DEPARTMENT D ON E.DEPARTMENTID = D.ID) AS ED
WHERE R < 4

 이 문제에서는 184번과 달리 RANK()와 DENSE_RANK()가 다르다. 

인원 수에 상관없이 상위 샐러리 3개의 값을 버는 모든 사람들을 보고 싶으므로

DENSE_RANK()를 사용해서 랭킹 3위 안에 드는 모든 사람을 찾을 수 있다

 

공동 순위만큼 다음 순위가 밀리는 RANK()는

부서별로 공동 순위를 차지하는 인원이 다를 수 있다는 점을 고려하면 적용하기 어렵다!

 

본 내용은 데이터리안 'SQL 데이터 분석 캠프 실전반' 을 수강하며 작성한 내용입니다.