몸과 마음이 건전한 SW 개발자

[SQL-MAX] 프로그래머스 Lv. 3 물고기 종류 별 대어 찾기 [다시 풀어 보기] 본문

SQL/다시 풀어 보기

[SQL-MAX] 프로그래머스 Lv. 3 물고기 종류 별 대어 찾기 [다시 풀어 보기]

스위태니 2024. 12. 22. 16:56

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/293261

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

틀린 코드

SELECT
    FI.ID,
    FNI.FISH_NAME,
    MAX(FI.LENGTH) AS LENGTH
FROM FISH_INFO FI
LEFT JOIN FISH_NAME_INFO FNI
ON FI.FISH_TYPE = FNI.FISH_TYPE
GROUP BY FNI.FISH_NAME
ORDER BY ID;

정답 코드

WITH MAX_FISH AS (
    SELECT
        FISH_TYPE,
        MAX(LENGTH) AS MAX_LENGTH
    FROM FISH_INFO
    GROUP BY FISH_TYPE
)
SELECT
    FI.ID,
    FNI.FISH_NAME,
    FI.LENGTH
FROM FISH_INFO FI
JOIN MAX_FISH MF
ON FI.FISH_TYPE = MF.FISH_TYPE AND FI.LENGTH = MF.MAX_LENGTH
JOIN FISH_NAME_INFO FNI
ON FI.FISH_TYPE = FNI.FISH_TYPE
ORDER BY FI.ID;

수정 과정

 

  1. MAX(FI.LENGTH)가 그룹화되지 않은 상태에서 ID를 포함하지 않아 에러가 발생:
    • MAX 함수는 그룹 내 최대값만 계산하지만, ID는 최대값을 가진 행에 대한 정보가 없으므로 추가 작업이 필요하다.
  2. GROUP BY에서 올바른 열을 사용하지 않음:
    • GROUP BY FNI.FISH_NAME만 사용하는 것은 부적절합니다. FISH_TYPE 또는 ID와 함께 사용해야 한다.

 

풀이 과정

 

  1. WITH MAX_FISH 서브쿼리:
    • FISH_INFO 테이블에서 FISH_TYPE별로 LENGTH의 최대값(MAX_LENGTH)을 계산한다.
    • WHERE LENGTH IS NOT NULL 조건을 추가하여 유효한 길이만 고려한다.
  2. 최대값에 해당하는 행 선택:
    • FISH_INFO 테이블과 MAX_FISH를 조인하여 FISH_TYPE과 최대 길이를 가진 행을 선택한다.
  3. 물고기 이름 추가:
    • FISH_NAME_INFO 테이블과 조인하여 FISH_NAME을 가져온다.
  4. 정렬:
    • 결과를 FI.ID 기준으로 오름차순 정렬한다.

 

느낀점

  • JOIN을 두 번이나 해야 할 줄은 몰랐다.