KEEP GOING

[MySQL] LeetCode : Nth highest Salary 본문

code review/sql

[MySQL] LeetCode : Nth highest Salary

jmHan 2022. 2. 18. 11:17
반응형

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

 

Nth Highest Salary - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

1. case when 사용

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      # Write your MySQL query statement below.
      SELECT CASE WHEN COUNT(tmp.salary) >= n THEN MAX(tmp.salary) 
                  ELSE NULL END
      FROM (
          SELECT DISTINCT salary
          FROM Employee
          ORDER BY salary ASC
          LIMIT n
       )tmp
   );
END

 

2. if 사용

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      # Write your MySQL query statement below.
      SELECT IF(COUNT(tmp.salary)>=n,MAX(tmp.salary),NULL)
      FROM (
          SELECT DISTINCT salary
          FROM Employee
          ORDER BY salary ASC
          LIMIT n
       )tmp
   );
END

 

3. limit, offset 사용

DECLARE 추가적인 변수 선언없이 SET N = N-1; 처리로 변수 사용 최소화 가능 

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  DECLARE M INT;
  SET M = N-1; 
  RETURN (
      # Write your MySQL query statement below.
      SELECT DISTINCT salary
      FROM Employee
      ORDER BY salary ASC
      LIMIT M, 1 
   );
END

 

 

- 사용자 정의 함수란 ? 

매개변수로 입력받은 값을 함수 내부 쿼리대로 동작하여 특정 값을 출력하는 것을 의미한다. 즉, 말그대로 사용자가 정의한 함수라는 뜻이다.   

 

- 기본 구조 

함수에 같은 값을 입력할 때 같은 값을 항상 출력한다면 DETERMINISTIC을 추가한다.

쿼리 내부에서 변수가 필요한 경우 DECLARE을 통해 변수를 지정할 수 있다. 선언한 변수에 값을 추가하고 싶다면 SET을 사용한다. 위에서 풀이한 1번처럼 DECLARE 선언 없이 RETURN 소괄호 안에 쿼리를 삽입하여 출력값을 유도할 수 있다. 즉, RETURN 문 사용은 필수적이지만 DECLARE, SET은 필요에 따라 사용한다.

CREATE FUNCTION '함수명'('매개변수명', '매개변수의 데이터타입')
RETURNS '출력값의 데이터타입' (DETERMINISTIC)
BEGIN
    -- 변수 선언시 
    DECLARE '변수명' '변수의 데이터타입';
    -- 변수에 값 대입시
    SET '변수명' = '값';
    RETURN (쿼리) 혹은 '변수명'
END

 

- 예시 

CREATE FUNCTION CustomerLevel(credit VARCHAR(20))
RETURNS VARCHAR(20) DETERMINISTIC
BEGIN
	DECLARE level VARCHAR(20);
	IF credit > 50000 THEN
        SET level = 'PLATINUM';
    ELSE
        SET level = 'NOT PLATINUM';
    END IF;
    RETURN level;
END

 

- n번째 행 출력하기 (limit, offset)

SELECT * FROM 테이블 LIMIT N-1, 1
SELECT * FROM 테이블 LIMIT 1 OFFSET N-1
반응형

'code review > sql' 카테고리의 다른 글

[MySQL] 2주차  (0) 2022.03.06
[MySQL] 1주차  (0) 2022.02.28
[MySQL] 정규 표현식 정리(REGEXP)  (0) 2022.02.09
[MySQL] LeetCode : Consecutive-Numbers  (0) 2022.02.07
[MySQL] LeetCode : Department Top Three Salaries  (0) 2022.02.04
Comments