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.
문제링크
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
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
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
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
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