FireDrago

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

코딩테스트/프로그래머스

[SQL] 입양 시각 구하기(2)

화이용 2024. 9. 12. 17:00

문제

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. 

ANIMAL_OUTS 테이블 구조는 다음과 같으며,

ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각

동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
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문을 작성해주세요. 

이때 결과는 시간대 순으로 정렬해야 합니다.

<예시

HOUR COUNT
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 14
8 23
9 11
10 43
11 1
12 2
13 3
14 24
15 7
16 6
17 3
18 2
19 4
20 0
21 0
22 0
23 0

 

풀이

처음에 쉽다고 생각하고 SQL을 작성했다.

select
    hour(DATETIME) as HOUR,
    count(*) as COUNT
from
    ANIMAL_OUTS
group by
    hour(DATETIME)
order by
    HOUR

 

이 쿼리는 시간별로 데이터를 그룹화하고, 각 시간대의 데이터를 카운트한다.
하지만 문제는, 데이터가 없는 시간대는 결과에 표시되지 않는다.

예를 들어, 1시에 데이터가 없으면 결과에서 1시가 빠지게 된다.

 

모든 시간대(0시부터 23시까지)를 표시하려면 SET 문을 이용해 변수를 사용해야 한다.
다음과 같이 @hour 변수를 초기화하고, 각 행마다 시간을 증가시키면서 해당 시간대의 데이터를 카운트한다.

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;: 변수 @hour를 -1로 초기화한다.
    이후 SELECT 구문에서 첫 번째 증가가 발생해 0부터 시작하도록 한다.
  • (@hour := @hour + 1) AS HOUR: @hour 변수의 값을 1씩 증가시켜 0부터 23까지의 모든 시간을 생성한다.
  • select 문에서 " = "는 비교 연산자로 사용되므로, 대입할 때는 반드시 " := "를 사용해야 한다.