Milky's note

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

SQL/SQL 코딩 테스트-프로그래머스

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

밀뿌 2021. 12. 27. 14:37

오늘은 MySQL의 CTE(Common Table Expression) 공통 테이블 표현식에 대해서 알아보도록 한다.

 

나름 SQL 코딩 테스트가 쉽다고 생각했었는데 .. 킥킥

처음 보는 문법이 나와서 정리하려고 한다.

그 문제는 바로바로 다음이다.

 

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

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

 

먼저, CTE는 MySQL 쿼리문 내에서 여러번 참조될 수 있도록 만들어진 임시 테이블이라고 볼 수 있다. 

오라클로 비유하자면 Connect by 와 같은 기능을 한다. 

SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 27;

문법은 다음과 같다.

[RECURSIVE] 에 표시를 한 이유는 RECURSIVE가 있으면 재귀, 없으면 비재귀 호출을 한다.

WITH [RECURSIVE] TABLE AS(
SELECT 초기값 AS 컬럼별명1
UNION ALL
SELECT 컬럼별명1 계산식 FROM 테이블명 WHERE 조건문)

 

쿼리 문법은 풀어서 쓰면 어려우니까, 프로그래머스의 문제로 예시를 들어보면 다음으로 나타낼 수 있다.

WITH RECURSIVE TEMP AS (
    SELECT 0 AS h
    UNION ALL
    SELECT h+1 FROM TEMP WHERE h < 23
)

시간 마다 입양 건이 얼마나 들어오나를 계산하는 문제였는데, 그냥 group by와 count로 수행하였는데 오류가 발생했다.  도대체 뭐가 문제지 했는데, 입양건이 없는 시간도 포함해서 0시~23시의 입양건을 보여주어야한다.

내가 처음에 수행한 쿼리는 07시~19시 밖에 없으니 당연히 오류가 발생하였다...ㅜ

 

그래서 with recursive를 사용하여 시간대별 list 테이블을 만들고 이를 기존 가지고 있던 테이블과 Join시켜서 결과를
출력해야한다. !!!!!

 

WITH RECURSIVE TEMP AS (
    SELECT 0 AS h
    UNION ALL
    SELECT h+1 FROM TEMP WHERE h < 23
)

SELECT h, count(HOUR(DATETIME))
FROM TEMP 
LEFT JOIN ANIMAL_OUTS 
ON h = HOUR(DATETIME)
group by h
order by h;

 

[참고] MySQL Join

Comments