MySQL

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

illho 2023. 5. 23. 15:39

문제 링크

 

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/59413

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

 

재귀 쿼리인 WITH RECURSIVE를 사용하여 0부터 23까지 출력하는 가상 테이블을 만들었다.

ANIMAL_OUTS 테이블과 가상테이블을 조인하여 GROUP BY를 0부터 23까지의 컬럼으로 하고 

ANIMAL_ID 컬럼을 COUNT 한다.

 

쿼리

 

WITH RECURSIVE HOURS AS (
    SELECT 0 AS HOUR1
    UNION ALL
    SELECT HOUR1 + 1 FROM HOURS WHERE HOUR1<23
) 
SELECT 
HOUR1,
COUNT(ANIMAL_ID)
FROM HOURS
LEFT JOIN ANIMAL_OUTS B
ON HOURS.HOUR1 = HOUR(B.DATETIME)
GROUP BY HOUR1
;

 

다른 방법

 

SET @HOUR := -1; 

SELECT (@HOUR := @HOUR +1) AS HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR) AS COUNT 
FROM ANIMAL_OUTS
WHERE @HOUR < 23

 

SET 함수를 이용한 풀이이다.

 

SET함수를 이용해서 0~23까지의 테이블을 만든다.

@HOUR = -1은 변수에 -1값을 넣는다는 의미이다.

ANIMAL_OUTS 의 시간과 SET 함수로 만든 테이블의 HOUR 값이 같을때 카운트를 한다.