본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Leet code - Second Highest Salary

by kime2 2024. 7. 12.
출처

 

 

문제

Write a solution to find the second highest salary from the table. If there is no second highest salary, return null

문제에 대한 해석

 

Employee 테이블에서 두번째로 높은 임금을 찾아라

없다면 null을 반환

 

1. 월급에 대한 순위를 매긴다 > 같은 임금일 경우 어떻게 해야 할까?

문제 예시를 보면 100이 가장 높은 임금으로 Id1과 ID2가 공동순위를 가진다

이때 두번째로 높은 임금은 50이므로 

총 임금에 대한 순위는 1,1,2로 공동순위에 상관없이 다음 순위가 매겨진다

> dense_rank

 

2. 두번째로 높은 임금이 없는 경우 null 값 반환

보통 테이블에서 조건으로 필터링한 경우 값이 없으면 아예 출력이 되지 않는다

값이 없는 경우 null값을 반환하는 경우

이때 집계함수를 사용하면 조건과 일치하는 값이 없어도 null값을 반환한다

 

풀이(MYSQL)

with base as (
    select DENSE_RANK()over(order by salary desc) as 'rn', salary
    from Employee
)
select max(salary) as 'SecondHighestSalary'
from base 
where rn =2

 

간단한 문제에 비교적 복잡하게 푼것 같다..

다른사람 풀이

-- 풀이1
select
(select distinct Salary 
from Employee order by salary desc 
limit 1 offset 1) 
as SecondHighestSalary;

  1. FROM 절: employee테이블에서 
  2. SELECT 절: salary의 고유값을 조회하라
  3. ORDER BY 절: salary가 높은순으로하여 1번째 행 이후부터 1개만 출력(첫번째 행이면 0)
  4. SELECT 절 : 서브쿼리의 단일값을 출력하라

 

-- 풀이2
Select max(salary)  AS SecondHighestSalary from employee
 where salary<(select max(salary) from employee);

  1. FROM 절: employee테이블에서 
  2. WHERE 절: salary의 가장 큰 값보다 작은 경우 필터링 하여
  3. SELECT 절: 필터링 된 값들중 가장 큰 값을 출력하라 

배운점

  • limit숫자 : 출력할 행의 수
  • offset 숫자 : 몇번째 행부터 출력할지(1번쨰 row면 0)  *즉, 어디서부터 행을 가져올지
    • select* from 테이블 limit 숫자 : 숫자행 만큼 출력
    • select* from 테이블 limit 숫자1 offset 숫자2 :숫자2(-1)번째 행부터 숫자1행 만큼 출력
    • select* from 테이블 limit 숫자1, 숫자2 :숫자1번째 부터 숫자2개 행을 출력
    • 행을 제한하는 limit와 offset은 페이징(paging) 처리에 활용하여 훨씬 빠르게 조회할 수 있다
    • paging : 검색 결과를 가져올 때 데이터를 쪼개 번호를 매겨 일부만 가져오는 기법
  • 순위함수
    • row_number : 결과 집합 내의 각 행에 고유번호를 할당
    • rank : 공동순위의 경우 같은 순위를 가지며 그만큼 건너뛰고 다음 순위를 매긴다
    • dense_rank : 공동순위를 갖지만 다음 번 순위를 건너뛰지 않는다
  • from절의 부재
    • 서브쿼리에서 스칼라값(단일값)을 조회할 경우 또다른 테이블을 참조할 필요가 없다