반응형
테이블 정보
1. FISH_INFO
Column name | Type | Nullable |
ID | INTEGER | FALSE |
FISH_TYPE | INTEGER | FALSE |
LENGTH | FLOAT | TRUE |
TIME | DATE | FALSE |
2. FISH_NAME_INFO
Column name | Type | Nullable |
FISH_TYPE | INTEGER | FALSE |
FISH_NAME | VARCHAR | FALSE |
예시 테이블
1. 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 |
2. FISH_NAME_INFO
FISH_TYPE | FISH_NAME |
0 | BASS |
1 | SNAPPER |
2 | ANCHOVY |
3. 출력 기댓값
ID | FISH_NAME |
6 | BASS |
8 | ANCHOVY |
9 | SNAPPER |
문제
물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.
물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.
아이디어
- 물고기의 ID는 FISH_INFO에 물고기 이름은 FISH_NAME_INFO에 길이는 FISH_INFO에 있다.
- 따라서 두 테이블을 FISH_TYPE을 기준으로 조인 처리를 해주어야 한다.
- 우선 물고기 타입, 이름, 최대값을 출력하는 서브 쿼리를 제작해 준다.
- 해당 서브쿼리는 GROUP BY를 통해 길이의 최대값을 갖는 물고기 하나만 출력해 주어야 한다.
- 이제 FISH_INFO와 서브쿼리를 비교하여 FISH_TYPE이 같으면서 LENGTH가 같은 물고기만 선택해 준다.
- ID를 기준으로 오름차순을 하고 물고기의 ID, 이름, 길이를 출력해 주면 된다.
정답
-- 코드를 작성해주세요
SELECT F.ID, S.FISH_NAME, S.LENGTH
FROM (
SELECT F.FISH_TYPE, N.FISH_NAME, MAX(F.LENGTH) AS LENGTH
FROM FISH_INFO F INNER JOIN FISH_NAME_INFO N
ON F.FISH_TYPE = N.FISH_TYPE
GROUP BY F.FISH_TYPE, N.FISH_NAME
ORDER BY 3 DESC
) S, FISH_INFO F
WHERE 1=1
AND F.FISH_TYPE = S.FISH_TYPE
AND F.LENGTH = S.LENGTH
ORDER BY F.ID
참고 사항
생각 나는대로 막 푼거라 최적화가 되어있다고 보장하지는 못한다.
728x90
반응형
'알고리즘 공부 > SQL' 카테고리의 다른 글
[L2] 프로그래머스 MYSQL 연도별 대장균 크기의 편차 구하기 (0) | 2024.10.18 |
---|---|
[L1] 프로그래머스 MYSQL 잡은 물고기 중 가장 큰 물고기의 길이 구하기 (0) | 2024.10.18 |
[L2] 프로그래머스 MYSQL 조건에 맞는 아이템들의 가격의 총합 구하기 (0) | 2024.10.17 |
[L2] 프로그래머스 ORACLE 중복 제거하기 (0) | 2024.10.17 |
[L1] 프로그래머스 ORACLE 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2024.10.17 |