홍동이의 성장일기

[LeetCode] 184. Department Highest Salary 본문

Tool/SQL 코딩테스트 풀이

[LeetCode] 184. Department Highest Salary

홍동2 2023. 8. 12. 20:29

 

Department Highest Salary - LeetCode

Can you solve this real interview question? Department Highest Salary - Table: Employee +--------------+---------+ | Column Name | Type | +--------------+---------+ | id | int | | name | varchar | | salary | int | | departmentId | int | +--------------+---

leetcode.com


[풀이 1] 다중컬럼 서브쿼리

select d.name Department
      , e.name Employee
      , e.salary Salary
from employee e left join department d
on e.departmentid = d.id
where (e.departmentid, e.salary) in (select departmentid, max(salary)
                                    from employee
                                    group by departmentid)

 

[풀이 2] 윈도우 함수 사용

SELECT Department
       , Employee
       , Salary
FROM (
    SELECT distinct d.name as Department
           , e.name as Employee
           , e.salary as each_salary
           , MAX(salary) OVER (partition by departmentId) AS Salary
    FROM employee e LEFT JOIN department d
    ON e.departmentId = d.id
	) AS m_salary
WHERE each_salary = Salary

 

💡 문제 풀이

 

[풀이 1]

다중컬럼 서브쿼리

다중컬럼 서브쿼리는 다중행 서브쿼리와 사용방법이 비슷하지만 비교하고 싶은 부분에 괄호를 쳐주어야 한다.

 

1. 먼저 서브쿼리에 부서id별 가장 높은 연봉을 구해준다.

2. employee테이블과 department 테이블을 조인한 테이블에서 해당조건에 맞는 행을 불러온다.

    departmentid와 salary 두 컬럼을 동시에 비교해주어야하기 때문에 다중컬럼 서브쿼리를 사용하였다.

 

 

[풀이 2]

 

1. employee 테이블과 department 테이블을 JOIN한다.

2. 원하는 컬럼을 가져온다

3. 윈도우 함수를 이용하여 departmentId별로 가장 높은 salary를 구한다.

SELECT distinct d.name as Department
       , e.name as Employee
       , e.salary as each_salary
       , MAX(salary) OVER (partition by departmentId) AS Salary
FROM employee e LEFT JOIN department d
ON e.departmentId = d.id

 

4. 위 코드를 FROM절 서브쿼리로 넣어준다.

5. WHERE절을 이용해 각 employee의 salary와 부서별 가장 높은 salary가 같은 행만 뽑아온다.


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

728x90
Comments