https://school.programmers.co.kr/learn/courses/30/lessons/293261
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 핵심 요약
각 물고기 종류(FISH_TYPE) 별로 가장 길이가 큰 물고기의 ID, 물고기 이름, 길이를 출력한다.
[조건]
- 종류별 최대 길이 물고기는 항상 1마리만 존재
- 10cm 이하 물고기가 최대인 경우는 없음
- 결과는 물고기 ID 오름차순 정렬
🔑 핵심 아이디어 : ROW_NUMBER()로 “종류별 1등” 뽑기
이 문제의 본질은 물고기 종류별로 길이를 기준으로 가장 큰 것을 남기는 것이다. 이럴 때 가장 깔끔한 방법이 윈도우 함수 + ROW_NUMBER()를 사용하는 것이다.
1. 물고기 이름을 얻기 위해 FISH_NAME_INFO 테이블과 JOIN
2. 종류별 길이 순 정렬 + 순번 부여
ROW_NUMBER() OVER (
PARTITION BY FI.FISH_TYPE
ORDER BY FI.LENGTH DESC
) AS RN
- PARTITION BY FI.FISH_TYPE : 물고기 종류별로 그룹 분리
- ORDER BY FI.LENGTH DESC : 길이가 큰 순서대로 정렬
- ROW_NUMBER() : 각 그룹에서 1등부터 순번 부여
3. 가장 큰 물고기만 필터링
❌ 왜 GROUP BY + MAX로 풀지 않았는가?
최대 길이는 구할 수 있지만 그 물고기의 ID를 알 수 없다. 서브쿼리를 겹겹이 써서 해결할 수는 있지만, 가독성과 안정성 모두 떨어진다.
SELECT ID, FISH_NAME, LENGTH
FROM (
SELECT FI.ID, FN.FISH_NAME, FI.LENGTH,
ROW_NUMBER() OVER (
PARTITION BY FI.FISH_TYPE
ORDER BY FI.LENGTH DESC
) AS RN
FROM FISH_INFO FI
JOIN FISH_NAME_INFO FN ON FI.FISH_TYPE = FN.FISH_TYPE
) T
WHERE RN = 1
ORDER BY ID
;'프로그래머스 > MySQL' 카테고리의 다른 글
| 연도별 대장균 크기의 편차 구하기 (0) | 2026.01.08 |
|---|---|
| 대장균의 크기에 따라 분류하기2 (0) | 2026.01.08 |