ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (Again) leetcode - 176. Second Highest Salary
    SQL 문제풀이 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 1

    Wrong 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, 1

    Wrong 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) SecondHighestSalary

    Accepted

     


     

    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 = 2

    Accepted

     

    select salary를 반환하면 안되고, 

    select max(salary)를 반환해야 정답!

Designed by Tistory.