본문 바로가기
SQL/코딩테스트

[프로그래머스 / MySQL] 입양 시각 구하기(1)

by Hi_heidi 2024. 1. 30.

문제

💡 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

테이블 형태

테이블 / 출력 결과 예시

 

풀이

SELECT HOUR(DATETIME) AS HOUR
        , COUNT (*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY HOUR

 

해설

SELECT HOUR(DATETIME) AS HOUR
        , COUNT (*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
  • 입양일에서 시간만 추출하는 함수 HOUR 를 사용했다
  • 시간대별 입양 건수 집계를 위해 SELECT 문에서 만든 HOUR 컬럼 사용하여 GROUP BY 에도 이용하였다
💡 날짜/시간 데이터에서 일부만 추출하기(Date and Time Functions)

YEAR 연도 추출
MONTH 추출
DAY 추출(DAYOFMONTH와 같은 함수)
HOUR 시 추출
MINUTE 추출
SECOND 초 추출
DAYNAME 영문 요일 출력(ex. Saturday)
DAYOFWEEK 요일의 숫자 인덱스 출력(ex. 1=Sunday, 2=Monday, ...)
 

MySQL :: MySQL 8.0 Reference Manual :: 14.7 Date and Time Functions

14.7 Date and Time Functions This section describes the functions that can be used to manipulate temporal values. See Section 13.2, “Date and Time Data Types”, for a description of the range of values each date and time type has and the valid formats

dev.mysql.com

HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY HOUR
  • HAVING 문으로 그룹핑한 결과에 조건을 부여해, 9시부터 19시대까지 포함될 수 있도록 하였다
  • ORDER BYHOUR 기준 오름차순 정렬하였다

 

2번째 풀이

SELECT HOUR(DATETIME) AS HOUR
        , COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
GROUP BY HOUR
ORDER BY HOUR
  • WHERE문에서 9시-19시 사이 조건을 지정한 뒤 GROUP BY 해주었다
  • WHEREHAVING에 둘다 적용할수 있는 조건이라면 WHERE절에 사용하는게 바람직하다(HAVING절은 각 그룹에 조건을 거는 방식이기 떄문에 리소스를 더 먹기 때문) [DATA ON-AIR 참고]
 

GROUP BY, HAVING 절

1. 집계 함수(Aggregate Function) 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 다중행 함수 중 집계 함수(Aggregate Function)의 특성은 다음과 같다. - 여러 행들의 그룹이 모여서 그룹당

dataonair.or.kr