177. Nth Highest Salary

Problem

Write a SQL query to get the nth highest salary from the Employee table. For example, given the above Employee table, the nth highest salary where n = 2 is 200. If there is no nth highest salary, then the query should return null.
문제링크

Answer

1. CASE와 사용자 정의 함수 활용한 문제풀이

CREATE FUNCTION getNthHighestSalary(N INT) 
RETURNS INT
BEGIN
  RETURN (
          SELECT CASE WHEN count(sub.salary) < N THEN NULL -- SELECT에 CASE쓰기
                 ELSE MIN(sub.Salary)
                 END
          FROM(
                 SELECT DISTINCT Salary
                 FROM employee
                 ORDER BY Salary DESC
                 LIMIT N
              ) sub
         );
END

2. IF문을 활용한 문제풀이

CREATE FUNCTION getNthHighestSalary(N INT) 
RETURNS INT
BEGIN
  RETURN (
          SELECT IF(Count(sub.salary) < N, NULL, MIN(sub.salary)) 
-- Case문 대신 IF(condition, True, False)를 사용함. 한컨디션에 대해서 참/거짓을 표현하기에 좋음.Syntax가 깔끔해지는 장점이 존재함. 
-- 하지만 조건이 여러개이고 순차적으로 실행되어야하면 Case문을 써주는 것이 더 좋다.-> WHEN을 여러개 써주면 되기 때문에 
          FROM(
                 SELECT DISTINCT Salary
                 FROM employee
                 ORDER BY Salary DESC
                 LIMIT N
              ) sub
         );
END

3. LIMIT를 활용한 문제풀이

(1) A라는 변수를 DECLARE해서 푸는 방법

CREATE FUNCTION getNthHighestSalary(N INT) 
RETURNS INT
BEGIN
  DECLARE A INT;
  SET A = N - 1;
  RETURN (
          SELECT DISTINCT Salary
          FROM employee
          ORDER BY Salary DESC
          LIMIT A, 1 -- N-1번째까지는 지우고 그 N번째를 가져오라는 의미
         );
END

(2) DECLARE에서 A라는 변수를 만들지 않고 그냥 N으로 해결 하는 방법

CREATE FUNCTION getNthHighestSalary(N INT) 
RETURNS INT
BEGIN
-- DECLARE A INT;
  SET N = N - 1;
  RETURN (
          SELECT DISTINCT Salary -- 장점: 서브쿼리를 안써도됨, IF문or CASE문 작성 필요없음. Aggregation function 작성 필요없어짐.  		   
          FROM employee
          ORDER BY Salary DESC
          LIMIT N, 1 -- N-1번째까지는 지우고 그 N번째를 가져오라는 의미
		 );
END

(3) LIMIT OFFSET을 활용한 방법

CREATE FUNCTION getNthHighestSalary(N INT) 
RETURNS INT
BEGIN
-- DECLARE A INT;
  SET N = N - 1;
  RETURN (
          SELECT DISTINCT Salary	   
          FROM employee
          ORDER BY Salary DESC
          LIMIT 1 OFFSET N -- 중간에 , 안들어감
		 );
END

0개의 댓글