177. Nth Highest Salary; CREATE FUNCTION, OFFSET/LIMIT, DENSE_RANK
https://leetcode.com/problems/nth-highest-salary/description/
1. Problem
전체 직원 중 N번째로 높은 고유한 급여를 찾아야 한다.
- 핵심 과제:
- 중복된 급여는 하나로 취급할 것 (DISTINCT).
- N번째 값이 존재하지 않으면 null을 반환할 것.
- 일반적인 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] 알맹이 끝 (울타리)
'Data Science > SQL' 카테고리의 다른 글
| T사 SQL 쿼리테스트 대비3: 퍼널 분석 (Funnel Analysis) (0) | 2026.02.05 |
|---|---|
| T사 SQL 쿼리테스트 대비2: A/B테스트 (0) | 2026.02.05 |
| T사 SQL 쿼리테스트 대비: MAU (0) | 2026.02.05 |
| [SQL/오답] 3회 연속 등장하는 숫자 찾기: LEAD vs 삼중 Self Join (LeetCode180 Medium) (0) | 2026.02.05 |
| C사 Business Analyst SQL 쿼리테스트 학습 목표 (0) | 2026.02.04 |