[프로그래머스] SQL 고득점 Kit - GROUP BY

robin·2021년 6월 21일
0

프로그래머스 SQL

목록 보기
3/5
post-thumbnail

ANIMAL_INS 테이블

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

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

고양이와 개는 몇 마리 있을까

문제

동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

솔루션

SELECT ANIMAL_TYPE
    , COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;

동명 동물 수 찾기

문제

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

솔루션

SELECT NAME
    , COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME ASC;

ANIMAL_OUTS 테이블

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

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

입양 시각 구하기(1)

문제

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

솔루션

SELECT HOUR(DATETIME) AS HOUR
    , COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR ASC;

HOUR(datetime)
: datetime에서 시간(hour) 부분만 리턴함.

입양 시각 구하기(2)

문제

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

솔루션

[step1]

WITH RECURSIVE time (HOUR) AS (
    SELECT 0
    UNION ALL
    SELECT HOUR + 1 FROM time WHERE HOUR < 23
)
SELECT * FROM time;
HOUR
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

[step2]

WITH RECURSIVE time AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 FROM time WHERE HOUR < 23
)
 
SELECT HOUR
     , COUNT(HOUR(ao.DATETIME)) AS COUNT
FROM time
LEFT JOIN ANIMAL_OUTS AS ao
ON time.HOUR = HOUR(ao.DATETIME)
GROUP BY HOUR
ORDER BY HOUR
HOURCOUNT
00
10
20
30
40
50
60
73
81
91
102
1113
1210
1314
149
157
1610
1712
1816
192
200
210
220
230

Common Table Expressions(공통테이블식)
: 공통테이블식은 쿼리 실행동안 존재하는 일시적인 쿼리 실행의 결과물임. 스스로 참조하거나(재귀공통테이블) 혹은 같은 쿼리에서 여러번 참조할 수 있음.

Recursive Common Table Expressions

[사용법]

WITH RECURSIVE cte_name AS (
    initial_query  -- anchor member
    UNION ALL
    recursive_query -- recursive member that references to the CTE name
)
SELECT * FROM cte_name;

[예시]

WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
n
1
2
3
4
5

출처:

profile
데이터 분석을 공부하는 🌱

0개의 댓글