Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- hackerrank
- 웹 스크랩핑
- 내일배움캠프
- wil
- TiL
- 스파르타 코딩
- 티스토리챌린지
- harkerrank
- 실전 데이터 분석 프로젝트
- 오블완
- 어쩌다 마케팅
- 텍스트 분석
- 회귀분석
- 프로그래머스
- MySQL
- 미세먼지
- 중회귀모형
- 스파르타코딩
- 스파르타
- R
- 내일배움카드
- 파이썬 철저입문
- 파이썬 머신러닝 완벽가이드
- 파이썬 머신러닝 완벽 가이드
- 프로젝트
- 내일배움
- SQL
- 파이썬
- 파이썬 철저 입문
- Cluster
Archives
- Today
- Total
OkBublewrap
입양 시각 구하기 본문
문제
- 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
데이터
입력 테이블
ANIMAL_OUTS
| NAME | TYPE | NULLABLE |
|---|---|---|
| ANIMAL_ID | VARCHAR(N) | FALSE |
| ANIMAL_TYPE | VARCHAR(N) | FALSE |
| DATETIME | DATETIME | FALSE |
| NAME | VARCHAR(N) | TRUE |
| SEX_UPON_OUTCOME | VARCHAR(N) | FALSE |
풀이과정
1. RECURSIVE 학습
WITH RECURSIVE recursive_name AS (
-- 기본 쿼리 (Anchor Member)
SELECT columns
FROM table
WHERE condition
UNION ALL
-- 재귀 쿼리 (Recursive Member)
SELECT columns
FROM table
JOIN recursive_name ON condition
)
SELECT * FROM recursive_name;
- 'WITH RECURSIVE' : 재귀 쿼리를 시작하는 키워드.
- 'RECURSIVE_NAME' : 재귀 쿼리의 결과를 임시 테이블처럼 사용할 이름
- 기본 쿼리 : 재귀 쿼리가 시작되는 기본 데이터를 반환하는 부분.
- 재귀 쿼리 : 기본 쿼리에서 반환된 데이터를 기반으로 반복적으로 데이터를 검색하는 부분
- 'UNION ALL' : 기본 쿼리와 재귀 쿼리의 결과를 결합합니다.
- 'SELECT' : 재귀 쿼리의 결과를 선택하여 반환합니다.
2. 0~23까지 테이블 생성
WITH RECURSIVE HOUR_TABLE AS(
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1 FROM HOUR_TABLE WHERE HOUR < 24
)
SELECT *
FROM HOUR_TABLE
3. 본 테이블 시간별 입양 수 구하기
SELECT HOUR(DATETIME) AS HOUR, COUNT(*)
FROM ANIMAL_OUTS
GROUP BY 1
ORDER BY 1 ASC
4. JOIN
WITH RECURSIVE HOUR_TABLE AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1 FROM HOUR_TABLE WHERE HOUR < 23
),
OUTS_TABLE AS (
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY 1
)
SELECT HT.HOUR, OT.COUNT
FROM HOUR_TABLE HT
LEFT JOIN OUTS_TABLE OT ON HT.HOUR = OT.HOUR
5. 결측값 처리
WITH RECURSIVE HOUR_TABLE AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1 FROM HOUR_TABLE WHERE HOUR < 23
),
OUTS_TABLE AS (
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY 1
)
SELECT HT.HOUR, COALESCE(OT.COUNT, 0) AS COUNT
FROM HOUR_TABLE HT
LEFT JOIN OUTS_TABLE OT ON HT.HOUR = OT.HOUR
ORDER BY 1 ASC;
'개발 > SQL' 카테고리의 다른 글
| 특정 기간동안 대여 가능한 자동차들의 대여 비용 구하기 (0) | 2025.01.10 |
|---|---|
| 상품을 구매한 회원 비율 구하기 (0) | 2025.01.10 |
| Weather Observation Station 20 / LAT_N 중앙값 구하기 (0) | 2025.01.10 |
| 자동차 대여 기록 별 대여 금액 구하기 (0) | 2025.01.10 |
| 헤비 유저가 소유한 장소 (0) | 2023.03.13 |