본문 바로가기
SQL

[LeetCode] Second Highest Salary

by 다람이도토리 2024. 1. 30.

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

 

LeetCode - The World's Leading Online Programming Learning Platform

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

MAX가 아닌, 두번째로 높은 거를 찾는 건데, 그렇게 만만한 문제는 아니다!

Sol 1) Dense_Rank를 이용한 풀이법
이게 동률일 경우도 고려해야 하므로, Rank를 매겨 2등을 찾고, 2등도 여러명일 수 있어 distinct 를 줄 수 있다.
마지막으로 2등이 없을 때를 대비하여 IFNULL로 0을 준다.

Remark. 이 방법으로 풀 경우 2를 N으로 고칠 경우, Nth 문제의 해결도 간단하게 된다.

SELECT
    IFNULL(
        (SELECT
            DISTINCT(SALARY)
        FROM(
            SELECT
                SALARY,
                DENSE_RANK() OVER (ORDER BY SALARY DESC) AS D_RANK
            FROM EMPLOYEE
        ) AS SUB
        WHERE SUB.D_RANK = 2
    ), NULL) AS SecondHighestSalary

 

Sol 2) 단순하게 MAX로 서브 쿼리를 쉽게 사용하는 방법
MAX는 없을 경우 NULL을 뱉어 줄 수 있는 애라고 한다.(없는 것을 연산해서 NULL) 따라서 IF_NULL이 필요 없다.

SELECT MAX(SALARY) AS SecondHighestSalary
FROM EMPLOYEE
WHERE SALARY < (
    SELECT MAX(SALARY)
    FROM EMPLOYEE
)

 

 

Sol 3) Offset을 활용하는 방법
이 역시, 0번 줄부터 활용하므로 N으로 일반화가 가능한 풀이이다.

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