TIL 172일차: 재귀 CTE

2024. 6. 28. 10:33회고/TIL(매일)

 

✏️도전한 점


1. 아티클 스터디 및 요약

2. 쿼리 스터디 준비하기

 

01 아티클 스터디


 

🔎아티클 스터디: GPT 발전 역사 돌아보기

01 오늘의 아티클 ‘GPT-5’를 기다리며: GPT 발전 역사 돌아보기 | 요즘IT인공지능 기술은 우리 삶과 사회에 혁명적인 변화를 불러왔으며, 그중 하나가 GPT(Generative Pre-trained Transformer)입니다. GPT는

specialda.tistory.com

 

02 알쿼리즘 스터디


나의 코드

WITH RECURSIVE hours AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1
    FROM hours
    WHERE HOUR < 23
)

SELECT h.HOUR, COALESCE(a.COUNT, 0) AS COUNT
FROM hours h
LEFT JOIN (
    SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR, COUNT(*) AS COUNT
    FROM ANIMAL_OUTS
    GROUP BY DATE_FORMAT(DATETIME, '%H')
) a ON h.HOUR = a.HOUR
ORDER BY h.HOUR;

- 'WITH RECURSIVE hours AS' 절은 Common Table Expression (CTE)을 사용하여 0부터 23까지의 숫자를 생성하는 재귀적인 쿼리이다.

- 'WHERE HOUR < 23'은 재귀 종료 조건이다. HOUR 값이 23보다 작을 때만 새로운 행을 생성한다.

- 마지막 실행은 'SELECT 22 + 1 FROM hours WHERE HOUR < 23' → HOUR = 23가 된다.

 

팀원 코드

# 재귀 CTE
WITH RECURSIVE hh AS
(
# 0으로 시작하는 HOUR 칼럼 만들기
    SELECT 0 HOUR
    UNION ALL
    SELECT HOUR + 1
    FROM hh
    # HOUR 가 22인 경우까지 제한
    WHERE HOUR < 23
)
SELECT hh.HOUR,
       COUNT(a.ANIMAL_ID) COUNT
FROM hh 
LEFT JOIN ANIMAL_OUTS a ON hh.HOUR = HOUR(a.DATETIME)
GROUP BY hh.HOUR
ORDER BY hh.HOUR

- LEFT JOIN 한 ANIMAL_OUTS의 ANIMAL_ID를 그대로 COUNT해서 바로 사용했다.

- 이를 위해서 재귀 테이블 HOUR과 HOUR(a.DATETIME)이 같다는 조건이 필요하다.

 

03 문제 링크


코딩테스트 연습 - 입양 시각 구하기(2) | 프로그래머스 스쿨 (programmers.co.kr)

 

✏️ 깨달은 점


1. HOUR 함수로 DATE_FORMAT을 대체하였음.

2. 서브쿼리 필요 없이 바로 COUNT를 사용할 수 있음.