[MySQL] 176. Second Highest Salary
2022. 11. 26. 21:03ㆍTIL💡/Database
https://leetcode.com/problems/second-highest-salary/
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
'TIL💡 > Database' 카테고리의 다른 글
[MySQL] 1873. Calculate Special Bonus (0) | 2022.11.27 |
---|---|
[MySQL] 1873. Calculate Special Bonus (0) | 2022.11.27 |
[MySQL] 584. Find Customer Referee (0) | 2022.11.26 |
[MySQL] 597. Friend Requests I: Overall Acceptance Rate (0) | 2022.11.26 |
[MySQL] 596. Classes More Than 5 Students(GROUP BY, HAVING) (0) | 2022.11.26 |