카테고리 없음

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

코드냠냠꿀꺽 2021. 9. 22. 16:48

문 제


접근

  1. ANIMAL_OUTS 테이블에는 시간이 0부터 나와있지 않다.
  2. 조인 할 수 있는 테이블이 필요여기서..생겨난 문제..

0부터 23까지의 테이블을 어떻게 만들지??....


일단 0~23까지를 가진 테이블이 필요하기 때문에 mysql에서 임시테이블을 만드는 방법을 찾아보았다.

그러다 찾은 방법이 with절!

(mysql8.0 이후 부터 사용가능)

 

사용방법

WITH '임시테이블명' AS
(
    생성할 쿼리
)

with 절에는 재귀, 비재귀 두가지 방법이 있고, 0~23까지를 가진 임시테이블을 재귀 방식을 통해 해결할 수 있다고 한다.
그렇게 해서 나온 방법이 !! 초깃값 0인 HOUR을 시작으로 +1 씩 23 이하일 경우까지 반복해서 임시테이블을 생성한다.

WITH RECURSIVE TIME AS (
    SELECT 0 HOUR
    UNION ALL
    SELECT HOUR + 1 FROM SS WHERE HOUR < 23
)

6~23부분 생략

 

다음, 생성된 TIME 임시 테이블과 ANIMAL_OUTS 테이블의 DATETIME 필드를 활용하여 결괏값을 도출해 낸다.

SELECT TIME.HOUR, COUNT(HOUR(OUTS.DATETIME)) AS COUNT
FROM TIME
LEFT JOIN ANIMAL_OUTS AS OUTS 
ON TIME.HOUR = HOUR(OUTS.DATETIME)
GROUP BY TIME.HOUR

결과

with 절

1. with는 view와 달리 결괏값이 저장된다고 한다.
2. 한번 정의하고 여러군데에서 사용할수록 효과가 좋다.
3. 쿼리를 저장하는 것이 아닌 결괏값을 저장함으로 여러번 사용하여도 연산을 줄일 수 있다.