[MySQL] 176. Second Highest Salary

2022. 11. 26. 21:03TIL💡/Database

https://leetcode.com/problems/second-highest-salary/

 

Second Highest Salary - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Medium 문제라서 SQL 메소드를 잘 써야 한다.

나는 우선 랭킹을 만든 후 랭킹에 해당하는 2번째 Salary 값을 가져오려고 했다.

그리고 CASE WHEN ELSE THEN을 써서 2번째 값이 없는 경우도 대처하려고 했다.

# Write your MySQL query statement below
SELECT CASE WHEN COUNT(t.salary) = 0 THEN null ELSE t.salary END AS SecondHighestSalary
FROM
(
    SELECT *, DENSE_RANK() OVER(ORDER BY salary DESC) AS rk
    FROM Employee
) AS t
WHERE t.rk = 2;

하지만 지나치게 복잡한 것 같다는 생각이 들어서 조금 더 간단한 방법을 찾아보기로 했다.

 

LIMIT, OFFSET을 쓰면 조금 더 간단하다.

SELECT DISTINCT
    Salary AS SecondHighestSalary
FROM
    Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1

LIMIT는 개수를 지정하고, OFFSET는 패싱하는 개수를 지정한다.

2번째 값을 가져오면 되므로 1개를 건너뛰고 1개를 가져오면 된다.

그런데 이렇게 하면 만약 2번째 값이 없는 경우 아무것도 출력되지 않는다.

 

이런 경우 temp table을 만들어서 select하면 null값으로 자동으로 출력된다고 한다.

참고로 중복의 경우를 위해 DISTINCT도 활용한다. RANK를 쓸 때는 DENSE_RANK를 활용하였다.

SELECT
    (SELECT DISTINCT
            Salary
        FROM
            Employee
        ORDER BY Salary DESC
        LIMIT 1 OFFSET 1) AS SecondHighestSalary
;

정석대로 IFNULL을 써도 좋다.

SELECT
    IFNULL(
      (SELECT DISTINCT Salary
       FROM Employee
       ORDER BY Salary DESC
        LIMIT 1 OFFSET 1),
    NULL) AS SecondHighestSalary