SQL 고득점 Kit - 8.11

김동현·2024년 8월 11일

SQL 고득점 Kit

목록 보기
23/56

SUM, MAX, MIN - 물고기 종류 별 대어 찾기

문제

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

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

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

풀이

WITH maxlength AS(
    SELECT ID, f.FISH_TYPE, f.LENGTH
    FROM FISH_INFO f
    INNER JOIN (
        SELECT FISH_TYPE, MAX(LENGTH) AS LENGTH
        FROM FISH_INFO  
        GROUP BY FISH_TYPE) a
    ON f.FISH_TYPE = a.FISH_TYPE
    AND f.LENGTH = a.LENGTH)
    

SELECT ID, FISH_NAME, LENGTH
FROM FISH_NAME_INFO f
INNER JOIN maxlength m
ON f.FISH_TYPE = m.FISH_TYPE
ORDER BY ID

리뷰

  • WITH 절에서 INNER JOIN 부분을 완벽하게 내가 작성하지 못했다. 2개의 WITH(CTE) 절을 사용해서 합치려고 했는데 한 쿼리에 CTE는 1개만 존재해야 하는 것을 몰랐다.... (대신 , 를 통해 구분하여 사용할 수 있다는 것을 발견!!)
  • 쿼리를 보면 아직은 이걸 이렇게 저렇게 하면 풀 수 있겠는데 하고 작성하면 약간 삐끗한 부분이 조금씩 존재한다 ㅋㅋㅋㅋ 언제 이런 것이 없이 성장하려나?

2차 풀이

  • 이게 초반에 도전하려고 했던 WITH 절을 2개 사용하려고 했다가 , 로 수정하면 가능한 것의 정답이다.
  • 이걸로 제출한 것이 아니라 위 풀이로 변경해서 제출하여 이러한 방법이 존재한다는 것을 알고 싶어 정리했다.
  • 확실히 정답으로 제출한 쿼리가 가독성이 좋고 간결해보인다. (나만 그려?)
WITH a AS (
    SELECT FISH_TYPE, MAX(LENGTH) AS LENGTH
    FROM FISH_INFO
    GROUP BY FISH_TYPE
), b AS (
    SELECT F.*
    FROM FISH_INFO f
    INNER JOIN a ON (f.FISH_TYPE = a.FISH_TYPE) AND (f.LENGTH = a.LENGTH)
)
SELECT ID, FISH_NAME, LENGTH
FROM b
INNER JOIN FISH_NAME_INFO f
ON b.FISH_TYPE = f.FISH_TYPE
ORDER BY b.ID;

GitHub

https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/3/293261.%E2%80%85%EB%AC%BC%EA%B3%A0%EA%B8%B0%E2%80%85%EC%A2%85%EB%A5%98%E2%80%85%EB%B3%84%E2%80%85%EB%8C%80%EC%96%B4%E2%80%85%EC%B0%BE%EA%B8%B0

profile
'The best way to get started is to quit talking and begin doing.'

0개의 댓글