자료구조 & 알고리즘ㅤ/ㅤ프로그래머스

[SQL] GROUP BY (4) 입양 시각 구하기 2 ✔

  • 테이블: ANIMAL_INS는 동물 보호소에 들어온 동물의 정보를 담은 테이블
  • 컬럼: ANIMAL_ID는 동물의 아이디, ANIMAL_TYPE는 생물 종, DATETIME는 보호 시작일, INTAKE_CONDITION는 보호 시작 시 상태, NAME는 이름, SEX_UPON_INTAKE는 성별 및 중성화 여부
NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

 

 

■ 문제

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

 

 핵심스킬

  • WITH RECURSIVE
  • SUBQUERY

 

 풀이

(방법 1) 로컬 변수 사용

  • @붙은 변수는 프로시져 종료되어도 살아있음을 유의
  • := 는 대입연산자
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

 

(방법 2) RECURSIVE 활용

  • RECURSIVE 란?
with recursive TIME as
    (select 0 as HOUR 
    union all 
    select HOUR + 1 
    from TIME where HOUR < 23)
select 
    HOUR
    , count(ANIMAL_ID) AS COUNT
from TIME
left outer join ANIMAL_OUTS 
    on (HOUR = HOUR(DATETIME))
group by HOUR;

 

 

 

 문제 링크

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