문제
💡 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 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 BY 로 HOUR 기준 오름차순 정렬하였다
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 해주었다
- WHERE 과 HAVING에 둘다 적용할수 있는 조건이라면 WHERE절에 사용하는게 바람직하다(HAVING절은 각 그룹에 조건을 거는 방식이기 떄문에 리소스를 더 먹기 때문) [DATA ON-AIR 참고]
GROUP BY, HAVING 절
1. 집계 함수(Aggregate Function) 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 다중행 함수 중 집계 함수(Aggregate Function)의 특성은 다음과 같다. - 여러 행들의 그룹이 모여서 그룹당
dataonair.or.kr
'SQL > 코딩테스트' 카테고리의 다른 글
[leetcode / MySQL] 1084. Sales Analysis III (2) | 2024.01.30 |
---|---|
[leetcode / MySQL] 184. Department Highest Salary (0) | 2024.01.30 |
[프로그래머스 / MySQL] 가격대 별 상품 개수 구하기 (0) | 2024.01.30 |
[프로그래머스 / MySQL] 최댓값 구하기 (0) | 2024.01.30 |
[프로그래머스 / MySQL] 어린 동물 찾기 (0) | 2024.01.30 |