CS/데이터베이스

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

JWonK 2023. 4. 28. 15:02
728x90
반응형

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

 

프로그래머스

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

programmers.co.kr

문제 설명

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

NAMETYPENULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

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

 

이 문제와 입양 시간 구하기(1)과 차이점은

  • 주어지지 않은 시간(hour, 0 ~ 23시 모두)도 명시하여 0으로 표시해줘야함

이다. 입양 시간 구하기(1)은 GROUPBY절로 같은 시간대만 그룹화해준 후 Counting만 해주면 됐는데 해당 문제는 존재하지 않는 시간대도 명시한 후 0으로 표시해주어야 한다.

 

어떻게 쿼리문을 작성할 수 있을까 고민했어야 한다. 아직 부족하기에 다른 풀이법을 참고하며 풀이를 진행하였다.

 

 

  1. 변수를 선언해주어 명시하고자 하는 시간 별로 진행해준다.
  2. 1번에서 명시한 시간대를 COUNT해준다.

 

 

  • SET으로 변수명과 초기값을 설정해준다.
    • @가 함께 존재하는 변수는 프로시저가 종료되어도 유지된다.
    • 종료되지 않기 때문에 값을 누적하여 0시부터 23시까지 진행한다.
  • @HOUR는 초기값 -1로 설정한다. PL/SQL 문법에서 :=은 비교연산자 =과 혼동을 피하기 위한 대입 연산이다.
  • SELECT(@HOUR := @HOUR+1)은 @HOUR의 값에 1씩 증가시키면서 SELECT문 전체를 실행한다.

 

-- 코드를 입력하세요
SET @HOUR := -1;

SELECT (@HOUR := @HOUR + 1) HOUR,
        (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR) COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
728x90
반응형