문제
Write a solution to find the second highest salary from the Employee table. If there is no second highest salary, return null (return None in Pandas).
테이블 형태

풀이
SELECT MAX(salary) AS SecondHighestSalary
FROM EMPLOYEE
WHERE salary <> (SELECT MAX(salary) FROM Employee)
해설
원래 윈도우 함수 중 집계함수(DENSE_RANK 등)을 사용해서 풀이하려고 했으나, 출력하고자 하는 값이 존재하지 않을 때 NULL을 반환하는 방법을 찾지 못해 다른 사람(bhumileetcode)의 풀이를 참고하였다. OFFSET을 활용한 방법도 있었는데 처음 접하는 문법이라 지금 이해할 수 있는 풀이법을 익혔다.
SELECT MAX(salary) AS SecondHighestSalary
FROM EMPLOYEE
WHERE salary <> (SELECT MAX(salary) FROM Employee)
- 2번째로 높은 급여를 출력해야 해야 하는데, 해당 값이 없으면 NULL을 출력해야 한다. 값이 없을 경우 NULL을 출력하는 것이 문제의 핵심이다
- WHERE문에서 서브쿼리를 활용해 Employee테이블에서 salary의 MAX값이 아닌 데이터만 필터링하고(=최고 급여 데이터 제외), 메인쿼리 SELECT문에서 다시 MAX값을 구해(=첫 번째로 높은 급여는 제외되었으므로 2번째로 높은 급여가 출력됨) 출력 컬럼명에 맞춰 출력한다
- 집계함수의 경우 매칭되는 값이 없으면 NULL을 반환한다[MySQL 공식문서 참고]
MySQL :: MySQL 8.0 Reference Manual :: 14.19.1 Aggregate Function Descriptions
MySQL 8.0 Reference Manual / ... / Functions and Operators / Aggregate Functions / Aggregate Function Descriptions 14.19.1 Aggregate Function Descriptions This section describes aggregate functions that operate on sets of values. They are
dev.mysql.com
'SQL > 코딩테스트' 카테고리의 다른 글
[leetcode / MySQL] 626. Exchange Seats (0) | 2024.02.22 |
---|---|
[leetcode / MySQL] 585. Investments in 2016 (0) | 2024.02.22 |
[프로그래머스 / MySQL] 진료과별 총 예약 횟수 출력하기 (0) | 2024.02.02 |
[프로그래머스 / MySQL] 성분으로 구분한 아이스크림 총 주문량 (0) | 2024.02.02 |
[프로그래머스 / MySQL] 모든 레코드 조회하기 (0) | 2024.02.02 |