문제
https://school.programmers.co.kr/learn/courses/30/lessons/59413
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
0~23시까지의 결과가 나오기 위해선 특정시간에 없는 데이터는 0으로 처리되어야한다.
일반적으로 GROUP BY HOUR를 한다면 데이터가 있는 시간만 결과로 나올 것이기 때문이다.
SQL 초보라 그런지 어떻게 해야할지 감이 안잡혀 다른 사람들의 풀이방법을 참고해보았다.
1. SET 사용
SET을 이용해 새로운 변수를 할당해주고 서브쿼리를 이용한다.
원본테이블의 DATETIME은 0시부터 23시까지 연속적으로 있지 않고 중간에 빠져있는 시간대가 있다.
따라서 SET을 사용하여 [0,1,2,3,...,23] 의 값이 있는 새로운 Colunm을 만들어줘야 한다.
다음 구문을 통해 ANIMAL_OUTS 테이블의 행 개수(N)만큼 HOUR 값이 [0,1,2,...,N-1]로 총 N개의 값이 출력될 것이다.
SET @HOUR = -1;
SELECT @HOUR := @HOUR + 1 AS HOUR
FROM ANIMAL_OUTS
? 여기서 드는 의문은 총 테이블의 행 개수 23개가 안된다면 만약 15개이면 0~14시까지만 가능할 것이다. 그렇다면 행 개수를 사용하여 연속적인 값을 만드는 것이 의미가 있는걸까.
! MySQL 변수 선언 방법
- SET @변수명 := '값';
이제 SET을 이용해 만든 HOUR 변수와 ANIMAL_OUTS의 DATETIME 변수의 시간과 동일한 값을 갖는 데이터를 COUNT 하면 된다.
마지막으로 0시~23시까지의 데이터만 출력해야하기 위해 WHERE 조건문을 추가한다.
*주의 사항
마지막 WHERE절에서 '@HOUR'을 사용해야한다. 'HOUR'변수는 SELECT절에서 새롭게 만들어진 칼럼변수이기 때문이다.
'@HOUR'은 '@HOUR + 1'로 재할당 되어 23이 되기 때문에 '@HOUR < 23' 을 해주는 것이다.
SET @HOUR = -1;
SELECT @HOUR := @HOUR + 1 AS HOUR,
(SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE @HOUR = HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23
출처: https://techblog-history-younghunjo1.tistory.com/146
'Database > MySQL' 카테고리의 다른 글
[Programmers/MySQL]대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (2) | 2023.02.16 |
---|---|
[MySQL] NULL 처리 (0) | 2023.02.14 |
[Programmers/MySQL] TRUNCATE() 와 ROUND() (0) | 2023.02.10 |
[Programmers/MySQL] HAVING, 날짜 관련 함수에 대해 (0) | 2023.02.10 |
[Programmers/MySQL] UNION ALL에 대해 (0) | 2023.02.09 |