본문 바로가기
「SQL초급떼기

코딩테스트 연습GROUP BY입양 시각 구하기(2)

by DayGo 2023. 4. 2.

https://school.programmers.co.kr/questions/39492

 

프로그래머스

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

programmers.co.kr

해당 해설이 좋아서 공유!!!!

 

 

 

나는 그냥 이렇게 했는데

select date_format(datetime, '%H') AS HOUR, HOUR(DATETIME) AS HOUR2,COUNT(*) AS CNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 0 AND 23
ORDER BY HOUR

 

 

 

아래 정답을 내신 고수는 

WITH문을 써서 서브쿼리 2개를 수행!!!

RECURSIVE는 처음 보는 구문이다!!!!!!

 

WITH RECURSIVE tb1 AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR+1 FROM tb1 WHERE HOUR < 23
) , tb2 AS (
    SELECT HOUR(DATETIME) AS HOUR
         , COUNT(DISTINCT ANIMAL_ID) AS CNT
    FROM ANIMAL_OUTS
    GROUP BY HOUR
)

SELECT tb1.HOUR
     , CASE WHEN tb2.CNT IS NULL THEN 0 ELSE CNT END AS CNT
FROM tb1
    LEFT JOIN tb2 ON tb1.HOUR = tb2.HOUR
ORDER BY HOUR

댓글