-
카테고리
-
세부 분야
데이터 분석
-
해결 여부
미해결
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
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
RETURNS INT
BEGIN
RETURN (
SELECT CASE WHEN sub.rank ' at line 17
답변을 작성해보세요.
0
지식공유자 J
지식공유자2022.07.25
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
답변 1