- 문제 설명
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문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
- 예시
SQL문을 실행하면 다음과 같이 나와야 합니다.
HOURCOUNT
0 | 0 |
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0 |
5 | 0 |
6 | 0 |
7 | 3 |
8 | 1 |
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
20 | 0 |
21 | 0 |
22 | 0 |
23 | 0 |
데이터상의 시간은 07시 ~ 19시가지 존재한다. 따라서, 0 ~ 23시까지 표에 나타내기 위해서는 추가적인 가공이 필요하다.
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
쿼리에서 대입을 나타나는 연산자는 :=이다.
시간이 0에서 부터 증가하는 것을 나타내기 위해, -1로 초기 값을 입력하고 @hour가 1씩 증가하는 것을 표현했다. 이후, HOUR와 COUNT 변수 모두 산출하기 위해 서브 쿼리를 이용하여 각 결과들을 산출하고 테이블을 완성한다.
2. WITH RECURSIVE 재귀쿼리로 결과 구하기
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
ON HOUR.h = HOUR(ANIMAL_OUTS.DATETIME)
GROUP BY HOUR.h
WITH RECURSIVE로 임시테이블 생성하기. 임시 테이블에서 h가 하나씩 증가하는 형태로 0 ~ 23까지의 숫자를 만들어 준다. 임시로 만들어 준 HOUR 테이블과 ANIMAL_OUTS 테이블을 LEFT JOIN하여 결과 값을 산출한다. 이때 일치하는 시간끼리 JOIN 했으므로, NULL 값들은 COALESCE 함수를 사용해서 0으로 채운다.
문제 출처: https://programmers.co.kr/learn/courses/30/lessons/59413
코딩테스트 연습 - 입양 시각 구하기(2)
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물
programmers.co.kr
[프로그래머스][MySQL]3.GROUP BY - 입양 시각 구하기(2)
GROUP BY의 4번 문제를 따로 다루게 된 이유는 먼저 내가 풀지 못해서이다. 이제까지 간단한 문법만을 사용해서 문제를 풀 수 있었는데 이 문제에서는 새로운 개념을 다뤄야 했기 때문에 바로 풀지
velog.io
'Database > Daily Coding' 카테고리의 다른 글
[Oracle][프로그래머스] GROUP BY / 입양 시각 구하기(1) (0) | 2022.05.10 |
---|---|
[MySQL][프로그래머스]String, Date(DATETIME에서 DATE로 형 변환) (0) | 2021.09.01 |
[MySQL][프로그래머스] String/Date(이름에 el이 들어가는 동물 찾기) (0) | 2021.08.26 |
댓글