SQL

[ORACLE] LeetCode Second Highest Salary

랩실외톨이 2021. 3. 13. 01:29
반응형

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

1. 서론

 

쿼리의 세계는 무궁무진하다... 프로그래머스 문제들이 적고 난이도가 쉬운 것 같아 리트코드에 진출했다.

근데 Easy도 난이도가 있네... ㅎ

 

2. 문제 풀이

 

Employee 테이블에 Salary값이 주어진다. 그중에서 두 번째로 큰 Salary 값을 구하는 문제이다.

 

조금 생각해 보다가 이건 내가 아는 지식 범위 밖의 문제인 것 같아서 얼른 찾아봤다.

 

참조: wakestand.tistory.com/295

 

오라클 최대값 2번째로 큰 값 N번째로 큰 값 구하는 방법

위와 같은 테이블을 가지고 SAL을 기준으로 봤을 때 최대값, 2번째 최대값 3,4,5 같은 N번째 최대값을 구하는 방법을 알아보자 먼저 최대값은 SELECT MAX(컬럼명) FROM 테이블명 두번째 최대값은 SELECT MA

wakestand.tistory.com

이 블로그에 잘 정리가 되어 있는 값들 중에 최댓값, 그리고 두 번째 값, 그리고 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값 중에 최댓값을 구하는데 그 조건이 최댓값을 빼고 구하는 것이므로 두 번째 최댓값을 구할 수 있다.

 

 

 

 

 

반응형