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

iinnuyh_s·2024년 1월 3일
0

SQL

목록 보기
3/17
post-thumbnail
post-custom-banner

입양 시각 구하기(2)

풀이

  • GROUP BY 에 WITH RECURSIVE 문제

    WITH RECURSIVE

    WITH 구문은 메모리 상에 "가상의 테이블"을 저장할 때 사용된다. RECURSIVE 여부에 따라 재귀, 비재귀 두 가지 방법이 가능한 것.

    WITH RECURSIVE
    • 가상 테이블을 생성하는데, 가상테이블이 자신의 값을 참조하여 값을 결정할 때 사용됨.
    • 예시 : 0~10의 값을 갖는 임시 테이블을 생성해라.
    WITH RECURSIVE CTE AS(
    SELECT 0 AS NUM # 초기값 설정
    UNION ALL
    SELECT NUM+1 FROM CTE
    WHERE NUM<10	#반복 멈추는 구간 설정
    )
  • WITH RECURSIVE 를 쓴 이유는,

    	SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
        FROM ANIMAL_OUTS 
        GROUP BY HOUR
        ORDER BY HOUR

  • 이렇게 풀게 되면 데이터 중에 HOUR이 없는 경우, 0~6이라든지,,, 이런 경우가 뽑히지 않는다.
  • 그래서, HOUR에 대해 0~23시까지 모두 갖고 있는 테이블을 하나 만들고, 위 SQL문과 JOIN을 해주면 된다.
  • 또, HOUR에 대해 데이터가 없는 경우 IFNULL(A.COUNT,0) 처리를 해줘야, NULL인 경우 빈칸이 아닌 0이 채워져서 나온다.
  • LEFT JOIN 인 이유는, ANIMAL_OUTS 테이블에 데이터가 없더라도, 임시 테이블인 CTE의 값은 다 나와야 되기 때문이다.
🙆‍♀️ 정답 풀이
WITH RECURSIVE CTE AS(
    SELECT 0 AS NUM
    UNION ALL
    SELECT NUM+1 FROM CTE
    WHERE NUM<23
)
SELECT CTE.NUM, IFNULL(A.COUNT,0) COUNT
FROM CTE
LEFT JOIN (
    SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
    FROM ANIMAL_OUTS 
    GROUP BY HOUR
    ORDER BY HOUR) A
ON CTE.NUM=A.HOUR;
post-custom-banner

0개의 댓글