250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 셀프조인
- 데이터리안넥스트레벨챌린지
- SQL고득점KIT
- SQL
- 데이터리안
- 데이터리안실전반
- 프로그래머스
- 문풀
- 서브쿼리
- 코테준비
- 오블완
- 파이썬
- leetcode
- 프로그래머스문풀
- 윈도우함수
- with절
- 위키독스
- 파이썬문풀
- levle1
- sql50
- sql문풀
- join
- SQL테스트
- leetcode문풀
- 그로스해킹
- 티스토리챌린지
- mysql
- 데벨챌
- 활성사용자수
- 약수구하기
Archives
- Today
- Total
꿈은 데이터분석가, 취미는 계획
[MY SQL] 세대별로 자식 수가 없는 개체 찾기 본문
728x90
출처: [프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] : 멸종위기의 대장균 찾기
링크: https://school.programmers.co.kr/learn/courses/30/lessons/301651
문제(일부): 세대별로 자식이 없는 개체의 수와 세대를 출력
재귀쿼리 사용하기
풀이원본: https://school.programmers.co.kr/questions/76223
1) 재귀쿼리로 세대를 구분하는 임시테이블 생성
1-1) 임시테이블의 첫번째 쿼리는 초기값으로 1세대로 지정(PARENT_ID가 NULL = 1세대)
1-2) UNION ALL 아래의 두번째 쿼리는 재귀쿼리로 PARENT_ID와 매칭되는 ID가 없을 때 까지 반복하여 세대를 구분
*재귀쿼리에 대한 설명: https://o-s-o-jjj.tistory.com/35
2) 세대별 자식의 수를 COUNT하는 임시테이블 생성
2-1) 테이블을 SELF JOIN하여 ID와 매칭되는 PARENT_ID의 수를 COUNT,
LEFT JOIN으로 PARENT_ID가 없는(자식개체가X)ID도 포함
3) 위 2개의 테이블을 ID를 기준으로 JOIN(세대별 COUNT 테이블은 서브쿼리로 자식 수가 0인 ID만 선택)
-- 재귀함수로 세대구분
WITH RECURSIVE GEN
AS (
SELECT ID, PARENT_ID, 1 AS DEPTH
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
SELECT CHILD.ID, CHILD.PARENT_ID, GEN.DEPTH + 1
FROM ECOLI_DATA CHILD
JOIN GEN
ON CHILD.PARENT_ID = GEN.ID
),
-- leftjoin으로 parent_id가 없는 id레코드 생성
-- ID별 자식의 수 COUNT
CHILD
AS (
SELECT A.ID, COUNT(B.ID) NUM FROM ECOLI_DATA A
LEFT JOIN ECOLI_DATA B
ON A.ID=B.PARENT_ID
GROUP BY A.ID
)
-- 재귀함수 테이블과 자식수 COUNT 테이블을 JOIN((자식수가 0인 테이블)
SELECT COUNT(*) COUNT, A.DEPTH GENERATION
FROM GEN A
JOIN (SELECT * FROM CHILD WHERE NUM=0) B USING (ID)
GROUP BY A.DEPTH
ORDER BY GENERATION
728x90
'SQL > SQL문풀' 카테고리의 다른 글
[MY SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.07.26 |
---|---|
[MY SQL] DATEDIFF와 TIMESTAMPDIFF 차이(날짜차이 구하기) (0) | 2024.07.21 |
[MY SQL] 재귀쿼리를 활용하여 특정 세대 찾기 (0) | 2024.05.08 |
[MY SQL] 기간별 할인율 가격에 반영하기 (0) | 2024.05.04 |
[MY SQL] 전화번호 '-'기호 넣기 (0) | 2024.04.29 |