출처
문제
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;
- FROM 절: employee테이블에서
- SELECT 절: salary의 고유값을 조회하라
- ORDER BY 절: salary가 높은순으로하여 1번째 행 이후부터 1개만 출력(첫번째 행이면 0)
- SELECT 절 : 서브쿼리의 단일값을 출력하라
-- 풀이2
Select max(salary) AS SecondHighestSalary from employee
where salary<(select max(salary) from employee);
- FROM 절: employee테이블에서
- WHERE 절: salary의 가장 큰 값보다 작은 경우 필터링 하여
- 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절의 부재
- 서브쿼리에서 스칼라값(단일값)을 조회할 경우 또다른 테이블을 참조할 필요가 없다
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] Leet code - duplicate-emails (0) | 2024.07.15 |
---|---|
[문제풀이] Leet code - Consecutive Numbers (0) | 2024.07.15 |
[문제풀이] Leet code - Restaurant Growth (0) | 2024.07.10 |
[문제풀이] Leet code - Movie Rating (0) | 2024.07.10 |
[문제풀이] 프로그래머스 - 언어별 개발자 분류하기 (0) | 2024.07.04 |