본문 바로가기

SQL Kit/GROUP BY

입양 시각 구하기(1) [ 프로그래머스 | SQL Kit | Level 2 ]

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

  • 정의: 데이터를 특정 열 값을 기준으로 그룹화하여 각 그룹별 요약 결과를 반환한다.
SELECT1, COUNT(*)
FROM 테이블명
GROUP BY1;

3. 문제 해결 절차

  1. 데이터 분석:
    • DATETIME 열에서 시간을 추출하여 각 시간별 입양 데이터를 분석해야 한다.
    • 입양 시간은 09:00부터 19:59까지로 제한된다.
  2. 필터링 조건 설정:
    • WHERE 절을 사용하여 DATETIME 열에서 시간(HOUR)이 9부터 19 사이인 데이터만 선택한다.
  3. 시간 추출 및 그룹화:
    • EXTRACT 함수를 사용하여 DATETIME 열에서 시간(HOUR)을 추출한다.
    • GROUP BY를 사용하여 시간별로 데이터를 그룹화한다.
  4. 집계 계산:
    • COUNT 함수를 사용하여 각 시간별 입양 건수를 계산한다.
  5. 결과 정렬:
    • 시간(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은 그룹화가 완료된 후 집계 결과에 조건을 적용하므로, 시간 조건과 같은 개별 레코드의 필터링에는 사용할 수 없다.