인프런- 데이터 분석을 위한 고급 SQL: 섹션7 - Nth Highest Salary 문제풀이(다시풀기)

르네·2023년 10월 3일
0

SQL

목록 보기
38/63

인프런 강의 <데이터 분석을 위한 고급 SQL>을 듣고, 중요한 점을 정리한 글입니다.

문제 : Nth Highest Salary

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    

: 맞음


  1. LIMIT 심화 활용 풀이방법
    : 서브쿼리 없이, LIMIT와 OFFSET을 이용해 풀기.
    N의 값을 바꾸고 싶다면, 변수를 선언하고 정의하는 DECLARE, SET statement를 활용하기.

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
: 이 쿼리문은 에러가 난다. 
profile
데이터분석 공부로그

0개의 댓글