SQL/[개념 및 문법]

[SQL] Recursive 표현으로 쿼리 만들기

hyunnn_00 2023. 4. 12. 13:18


 

잘못된 풀이

SELECT EXTRACT(hour FROM datetime) AS hour
    ,  COUNT(*) AS count
FROM animal_outs
GROUP BY hour
ORDER BY hour

 

 

시간대를 출력해서 개수를 세었더니 0시부터 23시까지 hour 컬럼이 생성되는 것이 아니라 hour이 있는 컬럼만 생성되었다.

 

 

정답 풀이

0시부터 24시까지 hour 컬럼 만들기

- recusrcive 쿼리(파이썬의 for문과 비슷)

-- with 테이블로 임시 테이블 생성
WITH RECURSIVE time AS (# 재귀쿼리 세팅
    SELECT 0 AS hour # 초기값 설정
    UNION ALL # 위의 쿼리와 아래의 쿼리 값을 연산
    SELECT hour+1 FROM time # 1씩 증가시킴
    WHERE hour < 23 # 반복 멈추는 용도
    )


SELECT time.hour
    ,  COUNT(hour(ao.datetime)) AS count
FROM time
    LEFT JOIN animal_outs ao ON time.hour = hour(ao.datetime)
GROUP BY time.hour # 안해주면 count가 전체 count가 됨

1. 임시테이블을 만들어 24시까지 1시간 간격의 테이블 생성

2. 원본 테이블과 left join하여 time테이블의 hour과 원본테이블의 hour이 일치하게 join

3. time.hour로 group by 해주기

 

sql에서도 for문과 비슷한 쿼리가 있는 줄 몰랐다. 앞으로 더 열심히 공부해야겠다.