본문 바로가기

algorithm

[programmers] MySQL - Lv.4 입양 시각 구하기 (2) (group by)

문제

 

 

 

 

풀이

 

set @hour = -1;
select (@hour := @hour + 1) hour,
       (select count(*) from animal_outs where hour(datetime) = @hour) count
from animal_outs
where @hour < 23
order by @hour

 

 

노트

 

처음에 문제 보고 지난번 풀었던 문제랑 동일하다 생각해서

SELECT hour(datetime) hour, count(*) count
from animal_outs
group by hour(datetime)
order by hour

 

이렇게 풀었더니

 

시간대가 7시부터 나오는 것을 보고 이렇게 쉽게 풀리는 문제가 아니라는 것을 알아차렸다.

내가 알고 있는 선에서는 이 문제를 풀 수 없어서 다른 사람 풀이를 검색해보니 새로운 변수를 만들어 푼 것을 알게 되었다.

변수로 시간을 만들고 각 시간대별 데이터의 개수를 조회하도록 해야 한다.

 

MySQL에서 사용자 정의 변수는

SET 변수 이름 = 대입 값; 
SET 변수 이름 := 대입 값;
SELECT 변수 이름 := 대입 값;

 

이렇게 선언이 가능하다. 

SET을 제외한 다른 쿼리문(SELECT문)에서는 ' = '을 비교 연산자(comparison operator)로 인식하기 때문에 SET이 아닌 쿼리문에서는 대입 연산자(assignment operator) ' := '를 사용해야 한다.

저장하는 값에 의해 자료형이 정해지며, Interger, Decimal, Float, Binary, String 타입만 취급이 가능하다.

또한, 변수를 초기화하지 않은 경우 값은 NULL, 자료형은 String 타입이 된다.

 

0시부터 23시까지 시간을 나타낼 변수를 먼저 선언해보면

set @hour := -1;

위와 같이 나타낼 수 있는데, 초기값을 -1로 지정한 이유는 0부터 나타내야 하고, 1씩 증가할 것이기 때문이다.

앞에서 정의한 변수를 활용해서 쿼리문을 만들어보면

set @hour = -1;  --시간을 나타낼 변수 선언 및 초기화
select (@hour := @hour + 1) hour,  --열(row)이 지날 때마다 1씩 증가 (1씩 시간대 증가)
       (select count(*) from animal_outs where hour(datetime) = @hour) count
         -- 변수에 입력된 시간과 입양 시각이 같은 데이터 카운트
from animal_outs
where @hour < 23 -- 시간대를 23시까지만 나타내고 종료
		-- where구로 조건을 지정해주지 않는다면 시간은 계속 1씩 증가
order by @hour  -- 시간순서대로 데이터 정렬

 

이렇게 만들 수 있다.

어렵군