데이터 분석

흐름을 읽고
인사이트를 만든다.

7.프로그래머스 SQL lv3 (물고기 종류 별 대어 찾기)

2026. 5. 11. 22:58프로그래머스 SQL

문제 설명
낚시앱에서 사용하는 FISH_INFO 테이블은 잡은 물고기들의 정보를 담고 있습니다. FISH_INFO 테이블의 구조는 다음과 같으며 ID, FISH_TYPE, LENGTH, TIME은 각각 잡은 물고기의 ID, 물고기의 종류(숫자), 잡은 물고기의 길이(cm), 물고기를 잡은 날짜를 나타냅니다.

단, 잡은 물고기의 길이가 10cm 이하일 경우에는 LENGTH 가 NULL 이며, LENGTH 에 NULL 만 있는 경우는 없습니다.

FISH_NAME_INFO 테이블은 물고기의 이름에 대한 정보를 담고 있습니다. FISH_NAME_INFO 테이블의 구조는 다음과 같으며, FISH_TYPE, FISH_NAME 은 각각 물고기의 종류(숫자), 물고기의 이름(문자) 입니다.

문제
물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.

물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.

문제 핵심

1.FISH_INFO와 FISH_NAME_INFO를 FISH_TYPE 기준으로 합쳐야한다. (join 사용)

2.물고기의 종류별로 가장 긴 길이를 찾아낸다. (Group by , Max 사용)

3.찾아낸 가장 긴 길이를 가진 물고기의 ID 와 이름을 추출한다. (서브쿼리 활용)

 

SELECT 로 결국에 최종적으로 출력할 컬럼들 호출 SELECT FI.ID, FNI.FISH_NAME, FI.LENGTH 

->Join 으로 두 테이블이 공통으로 가지고있는 FISH_TYPE 을 key 로 삼아서 데이터를 합친다.

-> WHERE 을 이용해서 가장 큰 물고기만 필터링(그냥 MAX(LENGTH)만 사용하면 ID 를 정확히 집어오기 힘들기때문)

그 후 오름차순 정렬해서 마무리

 

답변

SELECT FI.ID, FNI.FISH_NAME, FI.LENGTH

FROM FISH_INFO FI

JOIN FISH_NAME_INFO FNI ON FI.FISH_TYPE = FNI.FISH_TYPE

WHERE (FI.FISH_TYPE, FI.LENGTH) IN (

SELECT FISH_TYPE, MAX(LENGTH)

FROM FISH_INFO

GROUP BY FISH_TYPE

)

ORDER BY FI.ID ASC;

 

 

단순히 JOIN 만 하는게아니고 서브쿼리를 활용해서 그룹 내 최댓값의 전체 정보를 찾아내는 것이 핵심인 문제였다.