https://school.programmers.co.kr/learn/courses/30/lessons/59413
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)
- 0 ~ 23 까지 값을 갖고있는 테이블 H 를 생성한 뒤, LEFT JOIN 함
💬 WITH RECURSIVE에 대해 새롭게 알게됨! 시간 말고도 더미 날짜 테이블도 생성 가능하니 잊지말고 사용할 것!
'Algorithm > Programmars' 카테고리의 다른 글
[JAVA] 124 나라의 숫자 - 프로그래머스[Lv.2] (0) | 2024.02.06 |
---|---|
[SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 - 프로그래머스[Lv.3] (1) | 2024.01.31 |
[SQL] 저자 별 카테고리 별 매출액 집계하기 - 프로그래머스[Lv.4] (0) | 2024.01.28 |
[SQL] 조건에 맞는 사용자와 총 거래금액 조회하기 - 프로그래머스[Lv.3] (0) | 2024.01.27 |
[SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기 - 프로그래머스[Lv.3] (1) | 2024.01.27 |