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 데이터 분석 캠프 실전반' 을 수강하며 작성한 내용입니다.