1. 문제 목적
GROUP BY, COUNT, EXTRACT 함수를 활용하여 특정 시간 범위 내에서 각 시간별 데이터 개수를 계산하고 이를 정렬하는 과정을 통해 데이터의 시간 기반 분석을 수행하는 기술을 익힌다.
2. 핵심 개념
EXTRACT 함수
- 정의: 날짜와 시간 데이터에서 특정 부분(예: 연도, 월, 일, 시간 등)을 추출하는 함수.
EXTRACT(단위 FROM 날짜열)
단위: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 등.
예: EXTRACT(HOUR FROM '2022-01-01 10:30:00') → 10.
COUNT 함수
- 정의: 특정 열 또는 레코드의 개수를 계산하는 집계 함수.
SELECT COUNT(*)
FROM 테이블명;
- COUNT(*): 모든 레코드를 계산.
- COUNT(열 이름): NULL이 아닌 값만 카운트.
WHERE 절
- 정의: 특정 조건에 따라 데이터를 필터링하는 절.
SELECT *
FROM 테이블명
WHERE 조건;
- 조건식에는 비교 연산자, 논리 연산자 등을 사용할 수 있다.
GROUP BY
- 정의: 데이터를 특정 열 값을 기준으로 그룹화하여 각 그룹별 요약 결과를 반환한다.
SELECT 열1, COUNT(*)
FROM 테이블명
GROUP BY 열1;
3. 문제 해결 절차
- 데이터 분석:
- DATETIME 열에서 시간을 추출하여 각 시간별 입양 데이터를 분석해야 한다.
- 입양 시간은 09:00부터 19:59까지로 제한된다.
- 필터링 조건 설정:
- WHERE 절을 사용하여 DATETIME 열에서 시간(HOUR)이 9부터 19 사이인 데이터만 선택한다.
- 시간 추출 및 그룹화:
- EXTRACT 함수를 사용하여 DATETIME 열에서 시간(HOUR)을 추출한다.
- GROUP BY를 사용하여 시간별로 데이터를 그룹화한다.
- 집계 계산:
- COUNT 함수를 사용하여 각 시간별 입양 건수를 계산한다.
- 결과 정렬:
- 시간(HOUR)을 기준으로 오름차순 정렬하여 결과를 출력한다.
4. 코드 작성
-- 입양 시각 구하기(1)
SELECT
EXTRACT(HOUR FROM DATETIME) AS HOUR, -- DATETIME 열에서 시간을 추출하여 HOUR 열로 표시
COUNT(*) AS COUNT -- 각 시간별 입양 건수를 계산하여 COUNT 열로 표시
FROM
ANIMAL_OUTS -- 입양 데이터를 포함한 테이블
WHERE
EXTRACT(HOUR FROM DATETIME) BETWEEN 9 AND 19 -- 입양 시간이 09:00 ~ 19:59 사이인 데이터만 선택
GROUP BY
HOUR -- 시간(HOUR)별로 데이터를 그룹화
ORDER BY
HOUR ASC; -- 시간을 기준으로 오름차순 정렬
5. 코드 분석
SELECT 절
- EXTRACT(HOUR FROM DATETIME) AS HOUR:
- DATETIME 열에서 시간을 추출하고 결과 열 이름을 HOUR로 설정.
- COUNT(*) AS COUNT:
- 각 시간별 입양 건수를 계산하고 결과 열 이름을 COUNT로 설정.
FROM 절
- ANIMAL_OUTS:
- 입양 데이터를 포함한 테이블.
WHERE 절
- EXTRACT(HOUR FROM DATETIME) BETWEEN 9 AND 19:
- DATETIME 열에서 시간을 추출한 결과가 9(09:00)부터 19(19:59) 사이인 데이터만 선택.
GROUP BY 절
- HOUR:
- 시간별로 데이터를 그룹화하여 집계 함수가 적용되도록 설정.
ORDER BY 절
- HOUR ASC:
- 시간(HOUR)을 기준으로 오름차순 정렬하여 결과를 출력.
HAVING과 WHERE
1. HAVING과 WHERE의 차이
WHERE 절
- 그룹화되기 전에 데이터를 필터링한다.
- 데이터베이스에서 조건에 맞는 데이터를 먼저 선택한 후 그룹화를 수행한다.
- 필터링 조건이 **개별 레코드(행)**에 적용될 때 사용한다.
HAVING 절
- 그룹화된 데이터에 집계 함수의 결과를 기준으로 조건을 적용할 때 사용한다.
- GROUP BY가 수행된 후에 필터링을 적용하므로, 개별 레코드에는 적용할 수 없다.
2. 현재 문제에서 WHERE가 적합한 이유
문제에서는 입양 시간(HOUR)이 09시부터 19시 사이인 데이터를 선택한 후, 시간별로 데이터를 그룹화하고 건수를 계산해야 한다.
- WHERE 사용: 시간(HOUR)을 기준으로 데이터를 필터링하고 나서, 남은 데이터를 GROUP BY로 그룹화.
- HAVING 사용 불가: HAVING은 그룹화가 완료된 후 집계 결과에 조건을 적용하므로, 시간 조건과 같은 개별 레코드의 필터링에는 사용할 수 없다.
'SQL Kit > GROUP BY' 카테고리의 다른 글
조건에 맞는 사원 정보 조회하기 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.09 |
---|---|
가격대 별 상품 개수 구하기 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.09 |
고양이와 개는 몇 마리 있을까 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.09 |
진료과별 총 예약 횟수 출력하기 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.04 |
성분으로 구분한 아이스크림 총 주문량 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.04 |