Posts [프로그래머스] 입양 시각 구하기(1), (2) (GROUP BY, HAVING, SET)
Post
Cancel

[프로그래머스] 입양 시각 구하기(1), (2) (GROUP BY, HAVING, SET)

[프로그래머스] 입양 시각 구하기(1), (2)


프로그래머스의 SQL Kit에 있는 GROUP BY 문제들 중

  1. 입양 시각 구하기(1)
  2. 입양 시각 구하기(2)

문제입니다.


  • 등장하는 개념
    • GROUP BY 활용하기, HAVING 활용하기
    • 시간에서 시간대를 추출하는 HOUR 함수
    • SQL에서 변수를 선언하는 SET
    • 프로시저가 끝나도 계속 유지되는 @ 변수

1. 입양 시각 구하기 (1)

ANIMAL_OUT 테이블에 동물들의 정보가 담겨 있습니다. 각 테이블에는 다음과 같은 column들이 있습니다.

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE

이 데이터들 중에서 입양 시각 시간대를 기준으로 COUNT 하는 쿼리문을 작성해야 합니다.


  • 조회 : SELECT 를 활용합니다.
  • 수량 세기 : COUNT 를 활용합니다.
  • 그룹으로 묶기 : GROUP BY 를 활용합니다.
  • 시간 추출 : HOUR 을 활용합니다.

  • TYPE이 DATETIME 인 데이터에서 시간만 추출하려면 HOUR을 사용합니다.
1
2
3
4
SELECT HOUR(DATETIME) HOUR, COUNT(DATETIME) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR >= 9 and HOUR <= 19
  • SELECT 문의 HOUR(DATETIME) HOUR 은, 조회 결과 나온 열의 이름을 HOUR로 설정하겠다는 뜻입니다.

  • HAVING을 사용하지 않고, 아래와 같이 WHERE를 이용할 수도 있습니다.

1
2
3
4
SELECT HOUR(DATETIME) HOUR, COUNT(DATETIME) COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
GROUP BY HOUR(DATETIME)
  • 시간 순으로 정렬하려면 맨 끝에 ORDER BY HOUR 를 입력해야 합니다.

2. 입양 시각 구하기(2)

위 테이블 데이터를 토대로, 입양 시간대별로 입양이 몇 건이나 발생했는지 조회해야 합니다.

  • (1) 과 다른 점이라면, 모든 시간대(0시~23시)를 조회해야 합니다.
  • 갑자기 난이도가 상승한 레벨 4의 문제로, 쿼리문에서 로컬 변수를 활용하는 문제입니다.

1
2
3
4
5
6
SET @hour := -1; -- 변수 선언

SELECT (@hour := @hour + 1) as HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT
FROM ANIMAL_OUTS
WHERE @hour < 23

  • SET 옆에 변수명과 초기값을 설정할 수 있습니다.
    • @가 붙은 변수는 프로시저가 종료되어도 유지된다고 생각하면 됩니다.
    • 이를 통해 값을 누적하여 0부터 23까지 표현할 수 있습니다.
  • @hour은 초기값을 -1로 설정합니다. PL/-SQL 문법에서 :=은 비교 연산자 =과 혼동을 피하기 위한의 대입 연산입니다.
  • SELECT (@hour := @hour +1) 은 @hour의 값에 1씩 증가시키면서 SELECT 문 전체를 실행하게 됩니다.
  • 이 때 처음에 @hour 값이 -1 인데, 이 식에 의해 +1 이 되어 0이 저장됩니다.
    • HOUR 값이 0부터 시작할 수 있습니다.
    • WHERE @hour < 23일 때까지, @hour 값이 계속 + 1씩 증가합니다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

[프로그래머스] 고양이와 개는 몇 마리 있을까, 동명 동물 수 찾기 (GROUP BY, HAVING)

[프로그래머스] 없어진 기록 찾기 (JOIN, LEFT OUTER JOIN)