• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

Dense_rank를 활용한 풀이법 문의

22.07.21 15:08 작성 조회수 227

0

안녕하세요~ 177번 문제를 dense_rank를 활용해 풀어보고 싶어서 아래와 같이 코드를 작성했는데요. 오류와 함께 정답처리되지 않습니다. 어떤 부분이 잘못되었는지 알려주시면 감사하겠습니다! (MySQL ver)
 
▼코드
CREATE FUNCTION getNthHighestSalary(N INT) 
RETURNS INT
BEGIN
    RETURN (
            SELECT CASE WHEN sub.rank = N THEN sub.salary 
                        ELSE NULL
                   END AS getNthHighestSalary(N)
            FROM(
                SELECT id
                     , salary
                     , DENSE_RANK() OVER (ORDER BY salary DESC) AS rank
                FROM Employee
                ) sub
        
    );
END
 
▼오류내용
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 
RETURNS INT
BEGIN
    RETURN (
            SELECT CASE WHEN sub.rank ' at line 17

답변 1

답변을 작성해보세요.

0

alias로 'rank'라는 이름을 붙이셨는데, rank는 SQL에서 예약어로 쓰이고 있어서 해당 오류가 나는 것으로 보입니다.  'rnk' 등 다른 이름으로 수정해 주세요.

그리고 SELECT 절에서 지금과 같이 CASE 문으로 작성하면, 
모든 row의 rnk를 N과 비교하면서 비교 결과에 따라  salary 또는 null을 출력하기 때문에 row 수 만큼의 답이 나옵니다.

그러므로 WHERE 절에서 비교를 하고, 이에 해당하는 값만 중복 없이 가져오도록 작성해 주셔야 합니다.

아래 쿼리 참고 바랍니다. 

CREATE FUNCTION getNthHighestSalary(N INT) 
RETURNS INT
BEGIN
    RETURN (
            SELECT DISTINCT salary
            FROM(
                SELECT id
                     , salary
                     , DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
                FROM Employee
            ) sub
            WHERE rnk = N
    );
END