본문 바로가기
Database/Daily Coding

[MySQL][프로그래머스] GROUP BY(입양 시각 구하기2)

by LydiaRyu 2021. 8. 24.
반응형
  • 문제 설명

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

풀이 출처: https://velog.io/@jinseock95/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4MySQL3.GROUP-BY-%EC%9E%85%EC%96%91-%EC%8B%9C%EA%B0%81-%EA%B5%AC%ED%95%98%EA%B8%B02

 

[프로그래머스][MySQL]3.GROUP BY - 입양 시각 구하기(2)

GROUP BY의 4번 문제를 따로 다루게 된 이유는 먼저 내가 풀지 못해서이다. 이제까지 간단한 문법만을 사용해서 문제를 풀 수 있었는데 이 문제에서는 새로운 개념을 다뤄야 했기 때문에 바로 풀지

velog.io

 

728x90

댓글