취미가 좋다
입양 시각 구하기(2) 본문
https://programmers.co.kr/learn/courses/30/lessons/59413
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이 아닌 첫 번째 값을 반환한다.
'SQL 문제풀이 > 프로그래머스' 카테고리의 다른 글
우유와 요거트가 담긴 장바구니 (0) | 2021.08.12 |
---|---|
헤비 유저가 소유한 장소 (0) | 2021.08.12 |
입양 시각 구하기(1) (0) | 2021.08.12 |
동명 동물 수 찾기 (0) | 2021.08.12 |
고양이와 개는 몇 마리 있을까 (0) | 2021.08.12 |
Comments