몸과 마음이 건전한 SW 개발자

[SQL-GROUP BY] 프로그래머스 Lv. 3 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 [다시 풀어 보기] 본문

SQL/다시 풀어 보기

[SQL-GROUP BY] 프로그래머스 Lv. 3 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 [다시 풀어 보기]

스위태니 2024. 12. 23. 21:02

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

틀린 코드

WITH FISH_TOTAL_AVG AS (
    SELECT
        AVG(LENGTH) AS TOTAL_AVG
    FROM FISH_INFO
), FISH_TYPE_AVG AS (
    SELECT
        ID,
        FISH_TYPE,
        AVG(LENGTH) AS TYPE_AVG,
        MAX(LENGTH) AS MAX_LENGTH,
        COUNT(*) AS FISH_COUNT
    FROM FISH_INFO
    GROUP BY FISH_TYPE
), FISH_AVG_OVER AS (
    SELECT
        FTYA.ID,
        FTYA.MAX_LENGTH,
        FTYA.FISH_TYPE
    FROM FISH_TYPE_AVG FTYA
    JOIN FISH_TOTAL_AVG FTOA
    ON FTYA.TYPE_AVG >= FTOA.TOTAL_AVG
)
SELECT
    ID,
    MAX_LENGTH,
    FISH_TYPE
FROM FISH_AVG_OVER
ORDER BY FISH_TYPE;

정답 코드

WITH FISH_TYPE_STATS AS (
    SELECT
        FISH_TYPE,
        COUNT(*) AS FISH_COUNT,
        MAX(IF(LENGTH IS NULL, 10, LENGTH)) AS MAX_LENGTH,
        AVG(IF(LENGTH IS NULL, 10, LENGTH)) AS AVG_LENGTH
    FROM FISH_INFO
    GROUP BY FISH_TYPE
), FILTERED_FISH AS (
    SELECT
        FISH_TYPE,
        FISH_COUNT,
        MAX_LENGTH
    FROM FISH_TYPE_STATS
    WHERE AVG_LENGTH >= 33
)
SELECT
    FISH_COUNT,
    MAX_LENGTH,
    FISH_TYPE
FROM FILTERED_FISH
ORDER BY FISH_TYPE ASC;

풀이 과정

 

  1. FISH_TYPE_STATS CTE:
    • 물고기 종류별로 아래 데이터를 계산한다:
      • 잡은 물고기의 수 (FISH_COUNT)
      • 최대 길이 (MAX_LENGTH): NULL인 경우 길이를 10으로 간주.
      • 평균 길이 (AVG_LENGTH): NULL인 경우 길이를 10으로 간주.
  2. FILTERED_FISH CTE:
    • 평균 길이(AVG_LENGTH)가 33cm 이상인 물고기 종류만 선택한다.
  3. 최종 SELECT:
    • 필터링된 결과에서 FISH_COUNT, MAX_LENGTH, FISH_TYPE를 출력하고, FISH_TYPE 기준으로 오름차순 정렬한다.

 

느낀점

  • 문제에 평균 33이라고 나와 있는데 테스트 케이스 마다 평균이 다를줄 알고 다르게 계산했다.
  • 심지어 10cm이하는 NULL이고 10으로 잡고 계산해야 하는데 이것 또한 지키지 못했다.