본문 바로가기

DB/Programmers SQL Kit

[My_SQL] Lv.5 멸종위기의 대장균 찾기

문제

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이전에 아래 글처럼 특정 세대의 대장균을 찾은 적이 있다. 이때 서브쿼리를 재귀처리하여 사용했었는데 문제를 보자마자 일단 재귀로 각 세대를 다 찾아야겠구나 생각이 들었는데 또 다시 코드 노가다를 해야하나 싶었다.

그러다가 RECURSIVE라는 재귀용 함수를 찾았다. (효자다 효자)

RECURSIVE를 통해 각 대장균의 세대를 다 구해주니 너무 편하게 원하는 테이블을 만들었다.

이후 해당 테이블을 셀프 조인하고 세대별로 그룹화 한 뒤 문제를 해결했다.

 

[My_SQL] 특정 세대의 대장균 찾기

문제 무식하게 데이터를 뽑아냈다...PARENT_ID가 NULL 인 데이터의 ID를 1세대 A라하고 PARENT_ID가 A인 값들을 2세대 B PARENT_ID가 B인 값들을 3세대 C로 판단하여 출력했다.코드WITH GENERATION AS ( SELECT ID

yatanox.tistory.com

 

코드

WITH RECURSIVE G AS (
    SELECT D.ID, PARENT_ID, 1 AS GENERATION
    FROM ECOLI_DATA D
    WHERE PARENT_ID IS NULL
    
    UNION ALL
    
    SELECT D.ID, D.PARENT_ID, GENERATION + 1
    FROM ECOLI_DATA D
    INNER JOIN G ON G.ID = D.PARENT_ID
)

SELECT COUNT(*) AS COUNT, G1.GENERATION
FROM G g1 LEFT JOIN G g2 ON g1.ID = g2.PARENT_ID
WHERE g2.ID IS NULL
GROUP BY g1.GENERATION
ORDER BY 2 ASC;