Algorithm/Programmars

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

mopipi 2024. 1. 29. 16:38
반응형

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

 

프로그래머스

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

programmers.co.kr


WITH RECURSIVE H AS (
    SELECT 0  AS HR
    UNION ALL
    SELECT HR + 1
    FROM H
    WHERE HR < 23)
    
SELECT H.HR HOUR, IFNULL(T.CNT, 0) COUNT
FROM H
LEFT JOIN (SELECT DATE_FORMAT(DATETIME, '%H') HOUR, COUNT(*) CNT
          FROM ANIMAL_OUTS
          GROUP BY DATE_FORMAT(DATETIME, '%H')) T
ON H.HR = T.HOUR
ORDER BY H.HR;

💡 WITH RECURSIVE 구문 활용, IFNULL( ) 활용

풀이

  • 기존 테이블에서 시간 대 별로 데이터의 개수를 뽑아서 테이블 T를 만든다
    • 이전 단계 문제와 동일하게, 날짜에서 시간만 출력하기 위해 FORMAT %H 활용 => GROUP BY 기준으로 사용
  • T에 없는 날짜들도 최종 출력해야 함 (디폴트 0으로)
    • 0 ~ 23 까지 값을 갖고있는 테이블  H 를 생성한 뒤, LEFT JOIN 함
      • 0 ~ 23의 더미 테이블 생성하기 위해 WITH RECURSIVE 구문 사용 
    • H의 값 중 T에 없는 값일 경우 NULL값을 0을 디폴트로 출력하게  →  IFNULL(COUNT, 0)

 

💬 WITH RECURSIVE에 대해 새롭게 알게됨! 시간 말고도 더미 날짜 테이블도 생성 가능하니 잊지말고 사용할 것!

 

반응형