프로그래머스 | SQL 스터디 19 (재귀적 CTE) (완)

2024. 9. 24. 17:39·SQL/프로그래머스
반응형

SELECT

⭐특정 세대의 대장균 찾기(Lv4)

문제 설명

​

문제

​

풀이

출처 :  https://20240228.tistory.com/258

이 문제를 Self join을 2번해서 (노가다) 풀었지만 
더 좋은 풀이법이 있어서 출처를 남기고 올립니다.
 
WITH에서 GNEREATION을 설정합니다 
1세대의 경우, PARENT_ID가 NULL인 것이 1세대 입니다.
UNION ALL로 중복이 없게 합치고
추가적으로 PARENT_ID를 가지는 ID를 JOIN해서 세대를 추가합니다.
 
이렇게 푸는 것이 더 좋은 이유는 유지, 보수 측면에서 더 용이하기 때문입니다.
세대라는 칼럼을 추가해서 향후에도 세대를 찾고 싶을때 더 편하게 찾을 수 있죠

WITH RECURSIVE CTE AS (
    SELECT ID, 1 AS GENERATION -- 1세대 
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL 
    
    UNION ALL 
    
    SELECT D.ID, C.GENERATION + 1 -- 세대 추가 
    FROM ECOLI_DATA D 
    JOIN CTE C ON D.PARENT_ID = C.ID
)
SELECT ID 
FROM CTE 
WHERE GENERATION = 3 
ORDER BY ID;

 

 

GROUP BY

특정 조건을 만족하는 물고기 별 수와 최대 길이 구하기 (Lv3)

문제 설명

​

문제

 

풀이

SELECT에서 FISH_COUNT, MAX_LENGTH, FISH_TYPE를 조회

 

GROUP BY에서 FISH_TYPE으로 그룹화

 

HAVING에서 IFNULL(LENGTH,10)으로 NULL인 값은 10으로 바꿔주고, 그 값들의 평균이 33이상인지 설정

(WHERE로 쓰면 오류남! 그룹화를 한 값에 대해서는 HAVING을 써야한다!!)

 

ORDER BY에서 FISH_TYPE 를 오름차순 정렬

SELECT COUNT(*) FISH_COUNT, 
    MAX(LENGTH) MAX_LENGTH,
    FISH_TYPE
FROM FISH_INFO 
GROUP BY FISH_TYPE
HAVING AVG(IFNULL(LENGTH, 10)) >= 33
ORDER BY FISH_TYPE;

 

String, Date

분기별 분화된 대장균의 개체 수 구하기 (Lv2)

문제 설명

 

문제

​

풀이

SELECT에서 CASE WHEN으로 분기를 나누고 QUARTER라고 지칭, ECOLI_COUNT를 조회

​

GROUP BY에서 QUARTER별로 그룹화

 

ORDER BY에서 QUARTER 오름차순 정렬

SELECT 
    CASE
        WHEN MONTH(DIFFERENTIATION_DATE) >= 1 AND MONTH(DIFFERENTIATION_DATE) <= 3 THEN '1Q'
        WHEN MONTH(DIFFERENTIATION_DATE) >= 4 AND MONTH(DIFFERENTIATION_DATE) <= 6 THEN '2Q'
        WHEN MONTH(DIFFERENTIATION_DATE) >= 7 AND MONTH(DIFFERENTIATION_DATE) <= 9 THEN '3Q'
        WHEN MONTH(DIFFERENTIATION_DATE) >= 10 AND MONTH(DIFFERENTIATION_DATE) <= 12 THEN '4Q'
    END AS QUARTER,
    COUNT(*) ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER;

조금씩 문제를 풀다보니 어느새 프로그래머스에 있는 SQL 문제들은 다 풀게 되었다. 

처음에는 WITH 구문은 어색하기도 하고  잘 쓰지 못했는데, 이제는 나름 능숙하게 다루게 되었다. 

SQL이 쉽기는 하지만, 잘못 생각하면 집계를 이상하게 하거나 문법이 틀려서 출력이 안되는 경우도 허다하다.

그렇게 되면 결론도 잘못 도출될 수 있다.

그렇기에 데이터 분석가를 희망한다면 SQL은 정말 잘 다루어야 한다고 생각합니다. 

몇 번의 SQL코테를 치면서 느낀점은 '아직도 조금 모자라구나' 였습니다.

그래서 이후에는 leetcode나 hackerrank의 SQL 문제들도 꾸준히 풀 예정입니다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'SQL > 프로그래머스' 카테고리의 다른 글

프로그래머스 | SQL 스터디 18  (0) 2024.09.23
프로그래머스 | SQL 스터디 17  (1) 2024.09.20
프로그래머스 | SQL 스터디 16  (1) 2024.09.18
프로그래머스 | SQL 스터디 15 (SUBSTIRNG)  (2) 2024.09.17
프로그래머스 | SQL 스터디 14 (Union, Union all)  (3) 2024.09.16
'SQL/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | SQL 스터디 18
  • 프로그래머스 | SQL 스터디 17
  • 프로그래머스 | SQL 스터디 16
  • 프로그래머스 | SQL 스터디 15 (SUBSTIRNG)
kimmalgu
kimmalgu
DA(데이터 분석가) 블로그
  • kimmalgu
    kimmalgu의 블로그
    kimmalgu
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • 📊통계 (3)
      • [패캠] 데이터분석 부트캠프 (10)
        • 프로젝트 (2)
        • 수업 정리 (8)
      • Python (9)
        • 통계전산처리 (7)
      • SQL (27)
        • 프로그래머스 (20)
        • HackerRank (5)
        • LeetCode (1)
      • 코테 (0)
      • 📖독후감 (7)
  • 블로그 메뉴

    • 글쓰기
    • 홈
    • 태그
    • 방명록
  • hELLO· Designed By정상우.v4.10.0
kimmalgu
프로그래머스 | SQL 스터디 19 (재귀적 CTE) (완)
상단으로

티스토리툴바