-
(Again) leetcode - 176. Second Highest SalarySQL 문제풀이 2022. 6. 19. 22:58
난이도 : Medium
배운 점 : 집계함수를 포함한 쿼리는 결과값이 없을 때 null을 반환한다. 따라서 밑에 Wrong Answer라고 틀린 방법은 집계함수를 포함하지 않았기 때문이다.

고민 과정
추출할 데이터 = 두번째로 높은 salary
1. 가장 높은 salary 데이터 추출
2. where절을 활용하여 가장 높은 salary 보다 작은 salary 추출 ( = 가장 높은 salary 제외시키기)
3. order by와 limit를 활용하여 제일 위에 있는 두번째로 높은 salary 추출
방법 1
SELECT salary SecondHighestSalary FROM Employee WHERE salary < ( SELECT MAX(salary) FROM Employee ) ORDER BY salary DESC LIMIT 1Wrong Answer (답은 맞았지만 null 표시가 나타나지 않음 > 그 이유는 집계함수를 쓰지 않아서!)
방법 1을 아래와 같이 수정했더니 (집계함수 MAX를 추가),
SELECT MAX(salary) SecondHighestSalary FROM Employee WHERE salary < ( SELECT MAX(salary) FROM Employee )Accepted
구글링을 하는 과정에서 offset 함수를 새롭게 알게 되었다.
아래 쿼리는 limit와 offset을 활용한 쿼리이다.
방법2 (LIMIT, OFFSET)
SELECT salary SecondHighestSalary FROM Employee ORDER BY salary DESC LIMIT 1, 1Wrong Answer (답은 맞았지만 null 표시가 나타나지 않음) >> 집계함수가 없기 때문
추가적으로 limit, offset 설명을 덧붙이자면,
LIMIT 2 OFFSET 0 -- (0 + 1) 행부터 2개 추출 LIMIT 2 OFFSET 1 -- (1 + 1) 행부터 2개 추출 LIMIT 1, 2 -- (1 + 1) 행부터 2개 추출 LIMIT 1, 1 -- (1 + 1) 행부터 1개 추출
IFNULL을 활용한 방법 (이때 DISTINCT를 포함하지 않으면 wrong answer이 나온다)
SELECT IFNULL( (SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1, 1) , NULL) SecondHighestSalaryAccepted
Dense Rank를 활용한 방법
WITH sub AS ( SELECT salary , DENSE_RANK() OVER (ORDER BY salary DESC) rank FROM Employee ) SELECT MAX(salary) SecondHighestSalary FROM sub WHERE rank = 2Accepted
select salary를 반환하면 안되고,
select max(salary)를 반환해야 정답!
'SQL 문제풀이' 카테고리의 다른 글
leetcode - 175. Combine Two Tables (0) 2022.06.21 leetcode - 1069. Product Sales Analysis II (0) 2022.06.20 leetcode - 1068. Product Sales Analysis I (0) 2022.06.20 leetcode - 1050. Actors and Directors Who Cooperated At Least Three Times (0) 2022.06.20 leetcode - 178. Rank Scores (0) 2022.06.20