https://school.programmers.co.kr/learn/courses/30/lessons/59412

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

HOUR 을 사용합니다.

 

문제에서 유의해야할점은,

WHERE절에는 ALIAS 를 사용할 수 없다는 것 입니다.

WHERE 절은 데이터베이스 엔진이 데이터를 필터링할 때 사용되는데, 이 단계에서는 SELECT 절의 별칭이 아직 적용되지 않습니다.

 

그렇기에 직접 HOUR(DATETIME)을 적용합니다.

 

또, 저 같은경우 && 논리연산자를 통하여 진행했는데, 아래와 같이 여러방식으로 가능합니다.

WHERE HOUR(DATETIME) >=9 && HOUR(DATETIME) <=19
WHERE HOUR(DATETIME) >=9 AND HOUR(DATETIME) <=19
WHERE HOUR(DATETIME) BETWEEN 9 AND 19

 

또, 중요한점은, '%H' 를 사용하여야 합니다.

 

  • '%H':
    • 24시간 형식으로 시간을 표시합니다.
    • 00부터 23까지의 값을 사용합니다.
    • 한 자리 숫자일 경우 앞에 0을 붙입니다 (예: 01, 02, ..., 23).
  • '%h':
    • 12시간 형식으로 시간을 표시합니다.
    • 01부터 12까지의 값을 사용합니다.
    • 한 자리 숫자일 경우 앞에 0을 붙입니다 (예: 01, 02, ..., 12).
    • AM/PM을 구분하려면 별도로 '%p'를 사용해야 합니다.

 

또한, 헷갈리면 안되는 점은  GROUP BY 뒤에 WHERE 절이 직접 들어갈 수 없습니다.

즉, 항상 GROUP BY 절 앞에 WHERE절이 들어가서 먼저 필터링한 후 GROUP BY 를 한다고 생각해야 합니다.

SQL 쿼리의 일반적인 구조는 다음과 같습니다

SELECT 열_목록
FROM 테이블
WHERE 조건
GROUP BY 그룹화_기준
HAVING 그룹_조건
ORDER BY 정렬_기준

 

문제에서 원하는 타입은 "8" 이라고 생각헀지만 08이 들어가더라도 자동으로 문자열이 정수형으로 바뀌며 연산이 가능합니다.

코드

-- 코드를 입력하세요
# SELECT DATE_FORMAT(DATETIME,'%H')  AS HOUR
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >=9 AND  HOUR(DATETIME) <=19
GROUP BY HOUR
ORDER BY HOUR ASC;

 

%H가 아닌 %H라고 사용해야한다는 점을 유의합니다.

SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR, COUNT(*)
FROM ANIMAL_OUTS AS AO
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 20
ORDER BY HOUR ASC

아래와 거의 같으나, WHERE 절로 필터링합니다.

SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR, COUNT(*)
FROM ANIMAL_OUTS AS AO
WHERE DATE_FORMAT(DATETIME, '%H') BETWEEN 9 AND 20
GROUP BY HOUR
# HAVING HOUR BETWEEN 9 AND 20
ORDER BY HOUR ASC

 

 

ORACLE

가장 단순한 코드입니다. WHERE 절에서 먼저 시간을 필터링하고, 나머지 작업을 수행합니다. 

SELECT TO_NUMBER(TO_CHAR(AO.DATETIME, 'HH24')) AS HOUR, COUNT(*)
FROM ANIMAL_OUTS AO
WHERE TO_NUMBER(TO_CHAR(AO.DATETIME, 'HH24')) BETWEEN 9 AND 20
GROUP BY TO_NUMBER(TO_CHAR(AO.DATETIME, 'HH24'))
ORDER BY HOUR ASC

 

 

 

만약 아래와 같이 푼다면, WITH 구문으로 임시테이블을 만들어서 처리하므로 밖의 쿼리에서 HOUR을 토대로 손쉽게 WHERE 절과 SELECT문이 깔금해집니다.

WITH TIME_DATA AS (
    SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) AS HOUR
    FROM ANIMAL_OUTS
)

SELECT HOUR, COUNT(*)
FROM TIME_DATA
WHERE HOUR BETWEEN 9 AND 20
GROUP BY HOUR
ORDER BY HOUR ASC

 

즉, 이렇게 사용한것과 같습니다.

SELECT HOUR, COUNT(*)
FROM (
    SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) AS HOUR
    FROM ANIMAL_OUTS AO
)
GROUP BY HOUR
ORDER BY HOUR ASC

이렇게 서브쿼리에서 먼저 시간을 모두 추출하고, 메인쿼리에서 이 추출된 결과를 그룹화 및 집계한다면, 가독성측면에서는 유리합니다.

+ Recent posts