[LeetCode Hard] 185. Department Top Three Salaries

2024. 1. 7. 11:39·SQL 문제 풀이

테이블 정보

 

문제

A 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.

 

 

결과 예시

 

 

정답 코드 (MySQL)

WITH Salary_rank AS (
    SELECT id, name, salary, departmentId,
            DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC) AS salary_rank_by_department
    FROM Employee
)

SELECT d.name AS Department, 
        s.name AS Employee, 
        salary AS Salary
FROM Salary_rank s
JOIN Department d
ON s.departmentId = d.id
WHERE s.salary_rank_by_department <= 3;

 

 

문제 풀이

1. DENSE_RANK()

우선 부서 별로 급여가 3위 안에 드는 사원들을 출력하면 되는 문제이다.

문제 예시에서 볼 수 있다시피, 동점자인 IT 부서의 Joe와 Randy의 경우 2위로 동일 순위를 부여하고

그 다음 순위인 Will을 3위로 부여하는 것을 볼 수 있다. 

 

MySQL에는 순위를 반환하는 함수인 RANK()와 DENSE_RANK()가 존재한다.

두 함수를 비교하기 위해,

아래와 같이 사원 이름별 급여가 내림차순으로 정렬된 테이블이 존재한다고 생각해보자

 

Name Salary
Max 90000
Joe 85000
Randy 85000
Will 70000
Jung 50000

 

RANK()

  • 동점자가 있을 때, 같은 순위를 부여하고 그 다음 순위는 해당 동점자 수를 고려하여 증가한다.
  • 예를 들어, 위와 같은 테이블에서는 RANK()를 적용했을 때 1등, 2등, 2등, 4등, 5등이 된다.

 

DENSE_RANK()

  • 동점자가 있을 때, 같은 순위를 부여하고, 그 다음 순위를 연이어서 부여하는 기능이다.
  • 예를 들어, 위와 같은 테이블에서는 DENSE_RANK()를 적용했을 때 1등, 2등, 2등, 3등, 4등이 된다.

 

WITH Salary_rank AS (
    SELECT id, name, salary, departmentId,
            DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC) AS salary_rank_by_department
    FROM Employee
)

 

departmentId를 기준으로 PARTITION BY를 적용한 상태에서, DENSE_RANK()를 적용해준 쿼리를

가독성을 위해 WITH 절에 넣어주었다.

 

2. JOIN

departmentId가 Department 테이블의 id 컬럼을 참조하는 참조키이기 때문에,

이를 기준으로 Department 테이블과 INNER JOIN을 수행해준다.

 

즉, Salary_rank 서브쿼리 테이블의 별칭 "s"로 지정하고,

Department 테이블을 "d"로 지정한 후에 s.departmentId와 d.id를 기준으로 조인해준다.

이 때, WHERE 절에서 salary_rank_by_department 값이 3 이하인 행만 선택되게 조건을 추가해주면 된다.

 

SELECT d.name AS Department, 
        s.name AS Employee, 
        salary AS Salary
FROM Salary_rank s
JOIN Department d
ON s.departmentId = d.id
WHERE s.salary_rank_by_department <= 3;

'SQL 문제 풀이' 카테고리의 다른 글

[프로그래머스 Level 4] 우유와 요거트가 담긴 장바구니  (0) 2024.01.25
[LeetCode Hard] 601. Human Traffic of Stadium  (0) 2024.01.16
[LeetCode Medium] 1341. Movie Rating  (0) 2024.01.12
[LeetCode Medium] 550. Game Play Analysis IV  (0) 2024.01.05
[프로그래머스 Level 4] 입양 시각 구하기 (2)  (0) 2024.01.04
'SQL 문제 풀이' 카테고리의 다른 글
  • [LeetCode Hard] 601. Human Traffic of Stadium
  • [LeetCode Medium] 1341. Movie Rating
  • [LeetCode Medium] 550. Game Play Analysis IV
  • [프로그래머스 Level 4] 입양 시각 구하기 (2)
개발이조아용
개발이조아용
IT 개발에서 배운 성장의 기록을 작성합니다.
  • 개발이조아용
    계속 하다 보면?!
    개발이조아용
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • Tibero DB (Tmax AI Bigdata .. (7)
      • Git (2)
      • CI CD (2)
      • Redis (3)
      • SpringBoot (16)
      • SQL 문제 풀이 (8)
      • Apache Kafka (8)
        • 오류 해결 (3)
        • 개념 정리 (4)
        • 보안 (1)
      • Nginx (3)
      • SW마에스트로 (3)
      • Kubernetes (4)
      • AWS (5)
      • gRPC (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    MSA
    grpc
    redis
    SpringBoot
    Redis 개념
    소프트웨어 마에스트로
    K8S
    Kafka SASL
    Kafka 개념
    nginx
    KAFKA
    Tibero
    DynamoDB 연동
    leetcode
    redis script
    SASL 인증
    SQL
    Git
    Kafka 오류
    sql 문제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발이조아용
[LeetCode Hard] 185. Department Top Three Salaries
상단으로

티스토리툴바