인프런 강의 <데이터 분석을 위한 고급 SQL>을 듣고, 중요한 점을 정리한 글입니다.
Table: Employee
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
id is the primary key (column with unique values) for this table.
Each row of this table contains information about the salary of an employee.
Write a solution to find the nth highest salary from the Employee table. If there is no nth highest salary, return null.
The result format is in the following example.
Example 1:
Input:
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
n = 2
Output:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+
Example 2:
Input:
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
+----+--------+
n = 2
Output:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| null |
+------------------------+
1. CASE문 활용 풀이방법
-CREATE FUNCTION getNthHighestSalary(@N INT)
RETURNS INT AS
-BEGIN
- RETURN (
- SELECT CASE WHEN COUNT(sub.salary) < N THEN NULL
ELSE MIN(sub.salary)
END
FROM (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT N
) sub
- );
-END
2. IF function 활용 풀이방법
IF(conditon, value_if_true, value_if_false)
: 조건 / 조건 참일 때 출력 / 조건 거짓일 때 출력
ex. SELECT IF(500<1000, "YES", "NO")
SELECT IF(500<1000, "YES", NULL)
나의 풀이
-CREATE FUNCTION getNthHighestSalary(N INT)
RETURNS INT AS
-BEGIN
- RETURN (
- SELECT IF(COUNT(sub.salary) < N, NULL, MIN(sub.salary))
FROM (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT N
) sub
- );
-END
: 맞음
ex.
SELECT FROM table LIMIT 5, 10 # Retrieve rows 6~15
SELECT FROM table LIMIT 5, 1 # Retrieve rows 6
SELECT FROM table LIMIT n, 1 # Retrieve rows n+1
= SELECT FROM table LIMIT 1 OFFSET N
: 앞에서 N개는 없애고, 그 다음 거 하나를 가지고 와라
-CREATE FUNCTION getNthHighestSalary(N INT)
RETURNS INT AS
-BEGIN
- RETURN (SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 0 OFFSET N
- );
-END
-CREATE FUNCTION getNthHighestSalary(N INT)
RETURNS INT AS
-BEGIN
DECLARE A INT;
SET A = N - 1;
- RETURN (SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT A, 1
- );
-END
OR
-CREATE FUNCTION getNthHighestSalary(N INT)
RETURNS INT AS
-BEGIN
SET N = N-1
- RETURN (
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT N, 1
- );
-END
OR
-CREATE FUNCTION getNthHighestSalary(N INT)
RETURNS INT AS
-BEGIN
-- DECLARE A INT;
SET N = N - 1;
- RETURN (SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
- );
-END
: N-1번째까지는 지우고, 그 다음 것을 가지고 와라 -> N번째 가져옴
RETURN 결과값에 SELECT 쿼리 전체를 적어줄 수도 있다.
만약 조건이 여러개이고, 조건이 순차적으로 실행되어야 하는 상황이면 IF보다 CASE문을 쓰는 게 더 좋다.
내가 가지고 온 파라미터(N)을 쿼리문 중간에 (N-1)로 바로 변경하는 건 불가능하다. 수정하기 위해 DECLARE, SET을 사용해 변수선언해줘야 한다.
-CREATE FUNCTION getNthHighestSalary(N INT)
RETURNS INT AS
-BEGIN
- RETURN (
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT N-1, 1
- );
-END
: 이 쿼리문은 에러가 난다.