[프로그래머스 SQL] 입양 시각 구하기(2)

kiki·2024년 1월 11일
0

프로그래머스

목록 보기
55/79

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/59413

문제 설명

  • 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회
  • 결과는 시간대 순으로 정렬

N차 시도 - 통과

WITH RECURSIVE CTE AS(
    SELECT 0 AS NUM
    UNION ALL
    SELECT NUM+1 FROM CTE
    WHERE NUM < 23
)

SELECT NUM AS HOUR, IFNULL(COUNT, 0) AS COUNT FROM CTE
    LEFT JOIN (SELECT HOUR(DATETIME) AS HOUR,
       COUNT(*) AS COUNT
       FROM ANIMAL_OUTS
       GROUP BY HOUR(DATETIME)
       ) A ON A.HOUR=CTE.NUM
    ORDER BY 1

실제 데이터의 시간이 7~18시?? 까지 존재했는데, 문제에서 요구하는 것은 0~23시니까 이를 해결해줘야했다. 그러기 위해선 RECURSIVE를 사용해야하는 문제였다!
파이썬의 for문 혹은 while문 처럼 사용하는 것 같다. WITH구문을 이용해서 가상 테이블을 만들고, 이를 JOIN해서 0~23의 범위를 만드는 것
어렵다!!!!! 좀 더 사용해봐야 알겠다.

처음에 WHERE에 NUM<24 했다가 틀렸다. 왜냠 위의 SELECT NUM+1 FROM CTE를 하고나서 조건을 확인하는 것이니 NUM<23이 맞다

WITH 구문 (Common Table Expression (CTE))

  • WITH 구문은 가상 테이블을 만들 때 사용. RECURSIVE 여부에 따라 재귀/비재귀식으로 사용 가능
WITH [RECURSIVE] TABLE명 AS (
    SELECT - # 비반복문. 무조건 필수 (초기값 설정)
    [UNION ALL] # RECURSIVE 사용 시 필수. 다음에 이어붙어야 할 때 사용
    SELECT - 
    [WHERE -] # RECURSIVE 사용 시 필수. 정지 조건 필요할 때 사용
)
  • 출처: horang:티스토리
  • RECURSIVE는 자기 자신을 참조하여 값을 결정한다.
  • 두번째 SELECT는 반복되는 부분
  • WHERE문은 정지 조건 지정

0개의 댓글