본문 바로가기
Data Science/SQL

[SQL/함수] N번째 높은 급여 찾기: 사용자 정의 함수 CREATE FUNCTION와 OFFSET (LeetCode177 Medium)

by 에르모사 쩐뉴 2026. 2. 4.

177. Nth Highest Salary; CREATE FUNCTION, OFFSET/LIMIT, DENSE_RANK

https://leetcode.com/problems/nth-highest-salary/description/

1. Problem

전체 직원 중 N번째로 높은 고유한 급여를 찾아야 한다.

  • 핵심 과제:
    1. 중복된 급여는 하나로 취급할 것 (DISTINCT).
    2. N번째 값이 존재하지 않으면 null을 반환할 것.
    3. 일반적인 SELECT 문이 아닌, 값을 인자로 받는 함수(FUNCTION) 형태로 구현할 것.

2. Solution: 변수 선언과 LIMIT/OFFSET의 결합

SQL의 LIMIT 절은 특정 위치부터 데이터를 가져오지만, 0부터 시작하는 인덱스 특성상 N번째를 구하려면 N-1만큼을 건너뛰어야 한다.

3. Takeaway: 왜 이 풀이가 객관적이고 정교한가? (객관적 분석)

  • SET N = N - 1의 필요성:
    • 많은 SQL 환경에서 LIMIT 1 OFFSET N-1과 같은 직접적인 산술 연산은 문법 에러를 발생시킨다. 유진 님이 정리하신 것처럼 로직 시작 부분에서 SET을 통해 변수값을 확정 짓는 것이 가장 안전한 프로그래밍 방식이다.
  • DISTINCT와 ORDER BY의 순서:
    • 'N번째 높은 급여'라는 정의에 충실하기 위해 먼저 중복을 제거한 뒤, 높은 순서대로 줄을 세우는 논리적 순서가 정확히 반영되었다.
  • 함수(FUNCTION)의 구조적 이해:
    • CREATE - BEGIN - RETURN - END의 5단계 뼈대는 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 distinct salary from the Employee table. 
# 서로 다른 급여들 사이의 N번째로 높은 급여를 찾아라.
If there are less than n distinct salaries, return null.
# 급여가 1개뿐이라면 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                   |
+------------------------+

 

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  SET N = N - 1;                 # 1단계: OFFSET으로 쓸 변수를 미리 계산 (N-1)

  RETURN (
      SELECT DISTINCT salary     # 2단계: 중복 제거 후 정렬하여 N-1개를 건너뛰고 1개를 선택
      FROM Employee
      ORDER BY salary DESC
      LIMIT 1 OFFSET N           # SQL은 OFFSET 자리에 수식을 허용하지 않는 경우가 많음
  );
END

 

1. 함수 생성

CREATE FUNCTION 구문 뼈대

CREATE FUNCTION 함수이름(입력변수 타입) RETURNS 결과타입  -- [1] 껍데기 (선언부)
BEGIN                                                   -- [2] 알맹이 시작 (울타리)
                                                        -- [3] 로직 (여기서 SET도 하고 SELECT도 함)
    RETURN (결과값);                                    -- [4] 최종 결과 반납
END                                                     -- [5] 알맹이 끝 (울타리)