본문 바로가기
SQL 풀이

LeetCode 177 - Nth Highest Salary (MySQL / FUNCTION/ 한글)

by 알 수 없는 사용자 2025. 11. 29.

 

LeetCode 177 - Nth Highest Salary (MySQL / SQL 풀이 + 접근 방식)

카드사에서 SQL 기반 데이터 분석을 할 때, 특정 고객의 가장 최근 가입 이력이나 여러 건의 가입·조회·해지 이력 중에서 최신 N번째 기록을 반복적으로 조회해야 하는 경우가 많습니다. 기획자들은 SQL FUNCTION을 잘 사용하지 않는 편이지만, 저는 이러한 반복 패턴을 FUNCTION으로 캡슐화해서 구현해두고 실제로 업무 효율을 크게 높인 경험이 있습니다. 이번 LeetCode 177 문제는 이런 실무 패턴과 정확히 맞닿아 있는 문제로, “N번째 값 조회”를 함수로 추상화하는 SQL 연습에 매우 적합합니다.

🧩 문제 요약 (Problem Summary, SQL Explanation)

LeetCode 177번 문제의 목표는 Employee 테이블에서 N번째로 높은 distinct(서로 다른) 급여(salary)를 반환하는 MySQL FUNCTION을 작성하는 것입니다. Employee 테이블은 직원의 id와 salary를 가지며, 동일 급여가 여러 번 등장할 수 있기 때문에 중복 제거(DISTINCT) 후 정렬이 필요합니다. 또한 N보다 distinct salary 개수가 적을 경우 NULL을 반환해야 합니다. 이 패턴은 실무에서 고객 이력 데이터에서 “최근 N번째 이벤트”를 조회하는 로직과 매우 유사합니다.

👉 입력 테이블 구조

Column Name Type
id int
salary int

🧪 문제 해결에 필요한 SQL 함수 및 문법 정리

• DISTINCT (중복 제거)

DISTINCT는 중복된 값을 제거하고 고유한 값만 조회할 때 사용하는 SQL 키워드입니다.
실무에서는 고객별 유니크한 이벤트, 월별 고유 거래 금액, 중복 제거된 코드 목록 등 다양한 분석에서 자주 사용됩니다.
이 문제에서는 중복된 salary 값을 제거한 뒤 정확한 N번째 급여를 계산하기 위해 반드시 필요합니다.
예: SELECT DISTINCT salary FROM Employee;

• ORDER BY DESC (내림차순 정렬)

ORDER BY ... DESC는 큰 값 또는 최근 날짜 순으로 정렬할 때 사용하는 구문입니다.
Top-N 조회, 매출 상위 고객, 최신 이력 조회 등 순위 기반 집계에서 매우 자주 쓰입니다.
이 문제에서는 가장 높은 급여부터 N번째 순서를 계산하기 위해 내림차순 정렬이 필요합니다.
예: SELECT salary FROM Employee ORDER BY salary DESC;

• LIMIT + OFFSET (행 위치 제어)

LIMITOFFSET은 MySQL에서 특정 위치의 행을 정확히 선택할 때 사용하는 핵심 구문입니다.
예를 들어, 한 고객의 가입/해지/조회 이력에서 “3번째로 최근인 기록”만 가져와야 할 때도 동일한 패턴으로 사용합니다.
이 문제에서는 N번째 급여를 선택하기 위해 LIMIT 1 OFFSET N-1을 사용합니다.
예: SELECT ... ORDER BY salary DESC LIMIT 1 OFFSET 2; -- 3번째 값

• MySQL FUNCTION (사용자 정의 함수)

MySQL FUNCTION은 자주 쓰이는 SQL 로직을 재사용 가능한 함수 형태로 캡슐화할 수 있는 기능입니다.
카드사 실무에서는 기획자가 직접 FUNCTION을 만들거나 호출하지는 않더라도, 데이터 담당자가 “특정 순번의 이력 조회”, “가장 최근 상태값 조회”와 같은 반복 패턴을 FUNCTION으로 구현해두면 업무 효율과 유지보수성이 크게 올라갑니다.
실제로 저도 단일 고객의 가입/조회/해지 이력이 매우 많을 때, 등록일시 기준으로 최근 N번째 이력을 가져오는 FUNCTION을 만들어 놓고 반복해서 사용해 업무 효율을 개선했습니다.
LeetCode 177 문제 역시 이런 Top-N 조회 로직을 함수로 정리하는 좋은 연습 문제입니다.

🧠 접근 방식 (SQL Query Strategy)

이 문제는 “N번째로 높은 값”이라는 전형적인 Top-N SQL 패턴을 MySQL FUNCTION으로 감싸 재사용하는 구조입니다.

  1. DISTINCT를 사용해 Employee 테이블에서 중복된 salary를 제거합니다.
  2. ORDER BY salary DESC로 높은 급여부터 내림차순 정렬합니다.
  3. LIMIT 1 OFFSET N-1을 사용해 N번째 위치의 급여를 선택합니다.
  4. 이 쿼리를 MySQL FUNCTION getNthHighestSalary 안에 감싸 재사용 가능한 형태로 제공합니다.

이 구조는 제가 카드사 실무에서 사용했던 “최근 N번째 이력 조회” 쿼리와 완전히 동일한 패턴으로, MySQL에서 간결하면서도 직관적인 Top-N 구현 방식입니다.

🧾 정답 코드 (SQL Solution Code)

✔ SQL 정답 코드 (사용자 풀이 그대로)


CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    SET N = N - 1;
    RETURN (
        SELECT DISTINCT salary
        FROM Employee
        ORDER BY salary DESC
        LIMIT 1 OFFSET N
    );
END

📝 결론 및 실무 팁 (SQL, MySQL, Ranking Query 관점)

LeetCode 177 Nth Highest Salary 문제는 단순히 “급여 순위 찾기”를 넘어서, 실무에서 매우 자주 나타나는 Ranking Query / Top-N Query 패턴을 MySQL FUNCTION으로 정리해 두는 연습에 가깝습니다.

카드사에서 고객 원장 데이터를 다룰 때, 저는 다음과 같은 작업을 반복적으로 수행해야 했습니다.

  • 단일 고객 기준으로 가장 최근 가입 이력 1건만 조회
  • 가입/조회/해지 이력이 많은 고객에 대해 등록일시 기준 N번째 이력 조회
  • 중복된 이벤트/거래를 제거한 뒤, 특정 순번의 기록을 가져오는 로직

이러한 패턴을 매번 쿼리로 새로 작성하는 대신, FUNCTION으로 구현해두고 재사용하니 쿼리 작성 속도, 코드 가독성, 유지보수 측면에서 효율이 크게 향상되었습니다. MySQL, SQL, Ranking Query, Top-N Query를 실무적으로 활용하려면, 이렇게 자주 사용하는 로직을 함수로 만들어 두는 것이 실제로 도움이 됩니다.

 

막상 업무를 하다보면 급해서 잘 적용을 안하는 경우가 많은데 직접해보는게 많이 도움이 됩니다. 

 

*출처

문제 번호: LeetCode 177
문제 유형: Ranking / Aggregation / Sorting
SQL Engine: MySQL