🤔 문제
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 `ECOLI_DATA` 테이블입니다. `ECOLI_DATA` 테이블의 구조는 다음과 같으며, `ID`, `PARENT_ID`, `SIZE_OF_COLONY`, `DIFFERENTIATION_DATE`, `GENOTYPE` 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
최초의 대장균 개체의 `PARENT_ID` 는 `NULL` 값입니다.
대장균 개체의 ID(`ID`)와 자식의 수(`CHILD_COUNT`)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.
예시
예를 들어 `ECOLI_DATA` 테이블이 다음과 같다면
`ID` 1인 개체의 자식은 `ID` 3으로 1개 `ID` 2인 개체의 자식은 `ID` 4,5 로 2개 `ID` 4인 개체의 자식은 `ID` 6으로 1개이며 나머지 개체들은 자식이 없으므로 `ID` 에 대해 오름차순 정렬하면 결과는 다음과 같아야 합니다.
💻 나의 풀이
WITH CHILD AS (
SELECT PARENT_ID AS ID, COUNT(PARENT_ID) AS CNT
FROM ECOLI_DATA
GROUP BY 1
)
SELECT e.ID, IFNULL(c.CNT, 0) AS CHILD_COUNT
FROM ECOLI_DATA e
LEFT JOIN CHILD c ON e.ID=c.ID
ORDER BY 1;
결과
💡 다른 풀이
정답 처리 되었으나, 생각보다 내가 복잡하게 풀어서 다른 풀이를 찾아보았다.
1. 동일한 테이블을 LEFT JOIN한 풀이
SELECT P.ID, COUNT(C.PARENT_ID) AS CHILD_COUNT
FROM ECOLI_DATA P -- 부모라 가정
LEFT JOIN ECOLI_DATA C -- 자식이라 가정
ON P.ID = C.PARENT_ID
GROUP BY 1
ORDER BY 1
- 주어진 원본 테이블을 자기 자신과 `LEFT JOIN`하여 P(부모 테이블이라 가정)의 `ID`가 C(자식 테이블이라 가정)의 `PARENT_ID`와 일치하는 경우를 찾는다.
- 각 부모 ID(`P.ID`)에 대하여 자식 ID(`C.ID`)의 개수를 카운트해서 `CHILD_COUNT`라는 컬럼을 생성한다.
- 모든 대장균 개체(`P.ID`)를 그룹화해서 자식의 수를 계산한다.
2. 서브쿼리를 활용한 풀이
SELECT ID,
(SELECT COUNT(*)
FROM ECOLI_DATA
WHERE PARENT_ID = ED.ID) AS CHILD_COUNT
FROM ECOLI_DATA ED
ORDER BY 1;
원본 테이블(`ED`)의 자식 ID와 부모 ID가 일치하는 행에 대하여 개수를 카운트해서 반환하는 식
🔗 References
[서브쿼리를 활용한 풀이 참고]
'취업준비 > 코딩테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스 SQL 코딩테스트 연습] Lv5. 상품을 구매한 회원 비율 구하기 (MySQL) (4) | 2024.07.16 |
---|---|
[프로그래머스 SQL 코딩테스트 연습] Lv4. 5월 식품들의 총매출 조회하기 (MySQL) (0) | 2024.07.10 |
[프로그래머스 SQL 코딩테스트 연습] Lv4. 주문량이 많은 아이스크림들 조회하기 (MySQL) (0) | 2024.06.21 |
[프로그래머스 SQL 코딩테스트 연습] Lv3. 업그레이드 할 수 없는 아이템 구하기 (MySQL) (0) | 2024.06.19 |
[프로그래머스 SQL 코딩테스트 연습] Lv4. 입양 시각 구하기 (2) (MySQL) (3) | 2024.06.17 |