문제 설명
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문을 작성해주세요.
이때 결과는 시간대 순으로 정렬해야 합니다.
이 문제의 핵심은 0시부터 23시까지의 데이터를 출력해야한다.
처음에 단순하게 GROUP BY 를 사용해서 출력해보았다.
select DATE_FORMAT(datetime, "%H") as hour, count(DATE_FORMAT(datetime, "%H")) as count
from animal_outs
group by DATE_FORMAT(datetime, "%H")
order by DATE_FORMAT(datetime, "%H") asc;
결과는 데이터가 없는 시간에 대해서는 나오지 않았다. 당연한 결과다.
그럼 여기서 비어있는 시간대를 어떻게 0으로 표시해줄 수 있는지에 대해서 고민해봤다.
쿼리 상으로 어떻게 할 수 있을지 생각해보다가 결국 검색하러감 ㅎㅎㅎ
검색해보니 0시~23시 의 시간대가 주어져야 하고 그 시간대에 맞게 데이터를 입력해주어야 한다는 것이었다.
검색했던 방법 중에 한 가지 방법을 통해 문제를 풀어봤다.
SET 을 사용해서 hour 값을 만들어서 +1 씩 더해주어 0시부터 23시의 시간을 출력했고
hour 값인 경우 count 를 해서 각 시간마다 카운팅을 해서 값을 출력했다.
한정된 쿼리 내에서 해결하려고 하다보니 문제를 해결하지 못했던 것 같다.
따라서, 아래의 쿼리를 통해 원하는 결과를 얻을 수 있었다.
SET @hour = -1;
select (@hour := @hour +1) as hour,
(
select count(DATE_FORMAT(datetime, "%H"))
from animal_outs
where @hour = DATE_FORMAT(datetime, "%H")
) as count
from animal_outs
where @hour < 23;
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] Level 2. 삼각 달팽이 (C++) (0) | 2021.03.28 |
---|---|
[Programmers] Level 1. 신규 아이디 추천 (C++) (0) | 2021.03.22 |
[Programmers] Level 1. 두 개 뽑아서 더하기 (C++) (0) | 2021.03.22 |
[Programmers] Level 1. 크레인 인형뽑기 게임 (C++) (0) | 2021.03.22 |
[Programmers] Level 2. 위장 (C++) (0) | 2019.08.31 |