취미가 좋다

입양 시각 구하기(2) 본문

SQL 문제풀이/프로그래머스

입양 시각 구하기(2)

benlee73 2021. 8. 12. 19:43

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

 

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

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

programmers.co.kr

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 으로 변수와 초기 값을 설정한다.

":=" 는 대입 연산자로, 비교 연산자 "="와 다르다.

@hour 변수를 -1로 선언하였고, "@" 가 붙은 변수는 프로시저가 종료되어도 유지된다.

 

첫 SELECT 문에서 @hour를 1씩 증가시키며 전체를 실행한다.

처음부터 @hour에 값이 더해지기 때문에, 0부터 시작할 수 있다.

WHERE 조건이 만족하지 않을 때까지 반복된다.

 

 

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

SELECT h AS HOUR, COALESCE(COUNT(ANIMAL_ID),0) AS COUNT
FROM HOUR 
LEFT JOIN ANIMAL_OUTS ANI 
ON HOUR.h = HOUR(ANI.DATETIME)
GROUP BY HOUR.h;

WITH RECURSIVE 는 재귀 쿼리로, HOUR 라는 테이블을 만든다.

아래의 조건을 만족해야 한다.

  • (1) 메모리 상에 가상의 테이블을 저장
  • (2) 반드시 UNION 사용
  • (3) 반드시 비반복문도 최소한 1개 요구됨
  • (4) 서브쿼리에서 바깥의 가상의 테이블을 참조하는 문장(반복문)이 반드시 필요함
  • (5) 반복되는 문장은 반드시 정지조건이 요구됨
  • (6) 가상의 테이블을 구성하면서 자신을 참조하여 값을 결정할 때 유용함

 

COALESCE 는 주어진 인수에서 NULL이 아닌 첫 번째 값을 반환한다.

 

Comments