Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

leet code sql 176

176. Second Highest Salary

문제


상위 2번째 salary 계산하기

  • 중복한 값은 하나로 계산하여 구성
  • 만약 결과가 없으면 null

E.g

  • 1, 0, 0 → answer = 0
  • 1 → answer = null
  • 100, 100, 50 → answer = 50


문제 접근


접근 방식1.

dense_rank를 활용하여 2번째 salary를 추출하여 가장 큰 값을 조회

정답은 맞으나, 속도가 매우 느리다.

1
2
3
4
5
6
7
8
9
10
with Employee_salary as (
    select
        id,
        salary,
        dense_rank() over (order by salary desc) order_num
from Employee
)
select
    MAX(case when order_num = 2 then salary end) as SecondHighestSalary
from Employee_salary;

접근 방식2.

가장 큰 값을 조건절에 넣어 해당 값보다 작은 값중 가장 큰값을 조회

정답은 맞으나, 속도가 매우 느리다.

1
SELECT MAX(SALARY) FROM Employee WHERE SALARY < (SELECT MAX(SALARY) FROM Employee);

접근 방식3.

table을 group by 한 뒤 순서대로 나열한 다음 2번째 행에 대해서 출력

1
2
3
4
5
6
7
with a as (
    select salary from employee
    group by 1
    order by 1 desc
    limit 1 offset 1
)
select max(salary) from a;