leetcode.com/problems/second-highest-salary/
1. 서론
쿼리의 세계는 무궁무진하다... 프로그래머스 문제들이 적고 난이도가 쉬운 것 같아 리트코드에 진출했다.
근데 Easy도 난이도가 있네... ㅎ
2. 문제 풀이
Employee 테이블에 Salary값이 주어진다. 그중에서 두 번째로 큰 Salary 값을 구하는 문제이다.
조금 생각해 보다가 이건 내가 아는 지식 범위 밖의 문제인 것 같아서 얼른 찾아봤다.
이 블로그에 잘 정리가 되어 있는 값들 중에 최댓값, 그리고 두 번째 값, 그리고 n번째 값들을 구하는 방법이 나와있다.
최댓값은 max 함수를 이용해 구하고 두 번째 값은 max값을 구하는데 서브 쿼리로 최댓값을 제외한다. 이렇게 하면 최댓값을 하나 제외한 상태에서 최댓값을 구하게 되므로 두 번째 최댓값을 구할 수 있는 것이다.
SELECT SAL
FROM
(
SELECT ROWNUM AS RN, SAL
FROM
(
SELECT DISTINCT SAL
FROM EMP
WHERE SAL IS NOT NULL -- NULL 제외
ORDER BY SAL DESC
)
)
WHERE RN = 3
n번째 최댓값을 구하는 경우는 다음과 같다. (어렵고 복잡함 ㅠ)
sal의 중복을 제외하고 null인 경우도 제외하고 역순으로 리스트를 만든다. (sal이 큰 순서대로)
그리고 이 값들을 순번을 매긴다. ROWNUM을 쓰면 순번을 매길 수 있다. 그리고 순번의 칼럼 이름을 RN이라고 따로 붙여준다.
그리고 그중에서 N번째 값을 조건문으로 찾는 것이다...
무려 3중 쿼리문인데 이걸 즉석에서 바로 적을 수 있는 수준까지 갈 수 있을까?
3. 코드 설명
select max(salary) as "SecondHighestSalary"
from employee
where salary not in (select max(salary) from employee);
문제에서 칼럼 이름이 SecondHighestSalary라고 적혀있어 as로 별칭을 정해줬다.
salary값 중에 최댓값을 구하는데 그 조건이 최댓값을 빼고 구하는 것이므로 두 번째 최댓값을 구할 수 있다.
'SQL' 카테고리의 다른 글
[ORACLE] 프로그래머스 없어진 기록 찾기 (0) | 2021.03.14 |
---|---|
[ORACLE] 프로그래머스 오랜 기간 보호한 동물(1) (+MySQL) (0) | 2021.03.14 |
[ORACLE] 프로그래머스 입양 시각 구하기(1) (+MySQL) (0) | 2021.03.11 |
[ORACLE] 프로그래머스 NULL 처리하기(+MySQL) (0) | 2021.03.11 |
[ORACLE] 프로그래머스 동명 동물 수 찾기 (0) | 2021.03.11 |