-
프로그래머스_멸종위기의 대장균 찾기Programing Language/SQL 2025. 6. 13. 21:42반응형
https://school.programmers.co.kr/learn/courses/30/lessons/301651
각 세대별 자식이 없는 개체의 수(COUNT)와 세대(GENERATION)를 출력하는 SQL문을 작성해주세요. 이때 결과는 세대에 대해 오름차순 정렬해주세요. 단, 모든 세대에는 자식이 없는 개체가 적어도 1개체는 존재합니다. 멸종위기의 대장균 찾기
1. 최초 코드(재귀함수, inner join, left join 활용)
- 재귀함수 활용해서 ID별 노드 수 생성
- LEFT JOIN 해서 ID별 자식 유무 확인
-- ID별 GENERATION 생성 WITH RECURSIVE G AS ( -- 최초 ID별 레벨 생성 SELECT ID, 1 AS G_LEVEL FROM ECOLI_DATA WHERE PARENT_ID IS NULL UNOIN ALL -- 나머지 ID별 레벨 생성 SELECT A.ID, (B.G_LEVEL+1) AS G_LEVEL FROM ECOLI_DATA A INNER JOIN G B ON A.PARENT_ID = B.ID -- PARENT_ID 기준 G_LEVEL 생성 ) -- ID별로 자식 유무 붙이기 SELECT COUNT(DISTINCT A.ID) `COUNT` , A.G_LEVEL AS GENERATION FROM G A LEFT JOIN ECOLI_DATA B ON A.ID = B.PARENT_ID WHERE B.PARENT_ID IS NULL -- 자식이 없는 ID ; GROUP BY A.G_LEVEL2. 최적화 코드(재귀함수, EXISTS 활용)
- 재귀함수 활용해서 ID별 노드 정보 생성
- LEFT JOIN&WHERE 보다는 EXISTS가 더 대용량 데이터 처리에서는 성능이 좋음
WITH RECURSIVE G AS ( -- ID별 최초 레벨 생성 SELECT ID, 1 AS G_LEVEL FROM ECOLI_DATA WHERE PARENT_ID IS NULL UNION ALL -- ID별 나머지 레벨 생성 SELECT A.ID, B.G_LEVEL+1 G_LEVEL FROM ECOLI_DATA A INNER JOIN G B ON A.PARENT_ID = B.ID ) SELECT COUNT(A.ID) `COUNT` , A.G_LEVEL GENERATION FROM G A WHERE NOT EXISTS ( SELECT 1 FROM ECOLI_DATA B WHERE B.PARENT_ID = A.ID ) GROUP BY A.G_LEVEL ORDER BY A.G_LEVEL ASC ;반응형'Programing Language > SQL' 카테고리의 다른 글
프로그래머스_대장균의 크기에 따라 분류하기 2 (0) 2025.06.14 DAYOFWEEK 함수 (0) 2025.06.14 CTE(Common Table Expression) 완벽 이해 가이드 (1) 2025.06.13 MySQL DATETIME 성능 최적화 완벽 가이드 (0) 2025.06.13 프로그래머스_대여 기록이 존재하는 자동차 리스트 구하기 (1) 2025.06.13