👇 물고기 종류 별 대어 찾기
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🔓 문제 설명
물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.
물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.
(10cm 이하의 물고기는 NULL 처리)
예시 문제 데이터
[FISH_INFO]
| ID | FISH_TYPE | LENGTH | TIME |
| 0 | 0 | 30 | 2021-12-04 |
| 1 | 0 | 50 | 2020-03-07 |
| 2 | 0 | 40 | 2020-03-07 |
| 3 | 1 | 20 | 2022-03-09 |
| 4 | 1 | NULL | 2022-04-08 |
| 5 | 2 | 13 | 2021-04-28 |
| 6 | 0 | 60 | 2021-07-27 |
| 7 | 0 | 55 | 2021-01-18 |
| 8 | 2 | 73 | 2020-01-28 |
| 9 | 1 | 73 | 2021-04-08 |
| 10 | 2 | 22 | 2020-06-28 |
| 11 | 2 | 17 | 2022-12-23 |
[FISH_NAME_INFO]
| FISH_TYPE | FISH_NAME |
| 0 | BASS |
| 1 | SNAPPER |
| 2 | ANCHOVY |
⚡SQL Query
MySQL & Oracle 정답
SELECT FI.ID AS ID
, FNI.FISH_NAME AS FISH_NAME
, FI.LENGTH AS 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
)
Oracle 정답
SELECT SUB.ID, FNI.FISH_NAME, SUB.LENGTH
FROM (
SELECT ID, FISH_TYPE, LENGTH,
RANK() OVER (PARTITION BY FISH_TYPE ORDER BY LENGTH DESC) AS RK
FROM FISH_INFO
) AS SUB
JOIN FISH_NAME_INFO FNI ON SUB.FISH_TYPE = FNI.FISH_TYPE
WHERE RK = 1
ORDER BY ID ASC;
🔎 풀이 설명
MySQL & Oracle 풀이
1. 조인
- 물고기 이름을 알기 위해 각 테이블의 FISH_TYPE으로 결합합니다.
2. 다중 조건
- WHERE (FI.FISH_TYPE, FI.LENGTH) IN ()을 통해 각 타입별 최대 크기가 맞는지 확인합니다.
Oracle 풀이
1. FROM절
- 우선 FISH_INFO 테이블에서 FISH_TYPE별 물고기 크기(LENGTH)를 내림차순으로 정렬합니다.
2. 조인
- 물고기 이름을 알기 위해 각 테이블의 FISH_TYPE으로 결합합니다.
3. 순위 조건
- RANK() OVER()에 조건을 주어 각 그룹(PATITION)의 1순위를 추출할 수 있도록 조건을 주었습니다.
💡인사이트
1. NULL 처리
- MAX() 함수와 IN() 으로 비교 시 NULL인 행은 자연스럽게 제외됩니다.
2. 순위 함수
- ROW_NUMBER(): 1순위를 추출 시 최상위 1행만 출력합니다.(공동 1위가 있어도 내부 기준에 따라 딱 하나만 출력)
- RANK(): 1순위 추출 시 공동 1위를 모두 출력합니다.(1위가 3명이면 3명 다 출력 → 다음 순위는 4위)
- DENSE_RANK(): 1순위 추출 시 공동 1위를 모두 출력합니다.(1위가 3명이면 3명 다 출력 → 다음 순위는 2위)
3. 인덱스 설계
- FISH_INFO 테이블에 (FISH_TYPE, LENGTH DESC) 인덱스가 있다면, 서브쿼리의 GROUP BY와 MAX() 연산은 효율적으로 처리됩니다.
'🗄️ DB_이야기 > # ⚡SQL' 카테고리의 다른 글
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 언어별 개발자 분류하기(GROUP BY) (0) | 2026.04.20 |
|---|---|
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 연도별 대장균 크기의 편차 구하기(MAX) (0) | 2026.04.19 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 가격이 제일 비싼 식품의 정보 출력하기(MAX) (0) | 2026.04.19 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 멸종위기의 대장균 찾기(SELECT) (0) | 2026.04.18 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 특정 세대의 대장균 찾기(SELECT) (0) | 2026.04.18 |