https://school.programmers.co.kr/learn/courses/30/lessons/59412
코딩테스트 연습 > GROUP BY > 입양 시각 구하기(1)
문제 분석
난이도: LEVEL2
문제 요구사항
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
이때 결과는 시간대 순으로 정렬해야 합니다.
사용한 함수들 정리
https://20240228.tistory.com/209
정답 코드1(SUBSTRING, CAST)
SELECT CAST(SUBSTRING(DATETIME, 12, 2) AS SIGNED) HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR
먼저 DATETIME 년-월-일-시간-분-초 타입에서 SUBSTRING()을 사용해서 시간만 가져온다.
해당 데이터는 01, 02, 03, ... 10, 11, 11 ... 이런 식으로 가져와진다.
근데 쿼리 결과를 보면 01, 02 이런 형태가 아닌 1,2, ... 10, 11 형태이다.
물론 WHEN CASE 를 사용해서 0이 붙어있으면 THEN 이런 식으로 변환이 가능하지만
CAST(), CONVERT()를 사용해면 문자 타입을 쉽게 숫자 타입으로 바꿀 수 있다.
여기서는 CAST()를 사용해서 정수형으로 변환했다.
참고로 UNSIGNED는 양의 정수형이다.
그렇게 가져온 데이터를 HOUR 별칭을 주고
해당 HOUR를 기준으로 그룹화해준다.
그리고 원하는 시간대가 9시 ~ 19시 여서 HAVING 조건을 추가해 주었다.
시간대는 오름차순 정렬이니 ORDER BY 또한 HOUR를 기준으로 적용
정답 코드2(SUBSTRING, CONVERT)
SELECT CONVERT(SUBSTRING(DATETIME, 12, 2), SIGNED) HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR
정답 코드1와 동일
바뀐점: CAST → CONVERT
정답 코드3(DATE_FORMAT, CONVERT)
SELECT CONVERT(DATE_FORMAT(DATETIME, '%H'), SIGNED) HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR
정답 코드2와 동일
바뀐점: SUBSTRING → DATE_FORMAT(DATETIME, '%H' )
'Algorithm > Programmers SQL' 카테고리의 다른 글
[MySQL] 프로그래머스 중성화 여부 파악하기 (0) | 2024.09.11 |
---|---|
[MySQL] 프로그래머스 NULL 처리하기 (0) | 2024.09.11 |
[MySQL] 프로그래머스 DATETIME에서 DATE로 형 변환 (0) | 2024.09.11 |
[MySQL] 프로그래머스 가격이 제일 비싼 식품의 정보 출력하기 (0) | 2024.09.11 |
[MySQL] 프로그래머스 3월에 태어난 여성 회원 목록 출력하기 (1) | 2024.09.11 |