본문 바로가기
데이터 분석/SQL 연습문제

코테 연습 15일차 (프로그래머스 SQL 고득점 Kit)

2022. 2. 20.

My SQL / sublime

 

코딩테스트 연습 - 입양 시각 구하기(2)

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

문제: 입양 시각 구하기(2)

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

HOUR COUNT
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 3
8 1
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2
20 0
21 0
22 0
23 0

본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.


풀이

제출한 오답

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 0 AND 23
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME) ASC;

몰랐던 문법

 

SQL 문법 | 데이터 조회 및 필터 | 재귀쿼리 RECURSIVE QUERY

데이터 간의 계층 관계를 행과 열로 이루어진 표에서 직관적으로 표현하는 것은 쉬운일이 아니다. 그 어려운 일을 SQL은 재귀쿼리를 이용해서 시각화 해줄 수 있다. 단 계층을 재귀쿼리 RECURSIVE QU

zyngirok.com

 

[SQL] Recursive 표현으로 쿼리 만들기

프로그래머스의 입양 시각 구하기(2) 문제를 보게 되면서 고민에 빠지게 된다.0부터 24시까지의 hour 칼럼을 어떻게 만들지?계속 검색을 해본 결과, python처럼 for문을 써서 0부터 24까지 만드는 구문

velog.io

WITH RECURSIVE TIME // TIME이라는 임시 테이블 정의
    (SELECT 0 AS HOUR // 초기값 0으로 세팅
        UNION ALL // 위 아래 결과를 합침(중복 포함)
        SELECT HOUR+1 // 1씩 카운트업
        FROM TIME // TIME 테이블에서
        WHERE HOUR < 23) // HOUR가 23이 될 때까지
SELECT HOUR, COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM TIME LEFT OUTER JOIN ANIMAL_OUTS // TIME의 모든 행 기준으로 출력
ON (HOUR=HOUR(DATETIME)) // TIME의 'HOUR'와 ANIMAL_OUTS의 HOUR(DATETIME)이 동일한 경우
GROUP BY HOUR

-> RECURSIVE 재귀함수를 말한다. 위 문제에서의 핵심은 자기 자신을 참조하여 일련의 리스트를 만드는 것. 그리고 그 리스트를 기준으로 COUNT(HOUR(DATETIME))의 값을 매칭해주는 것. 그리고 LEFT OUTER JOIN을 사용해서 값이 없는 (ex. 0~6시) 행도 출력해준다.

2022.02.20

댓글