Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @GeneratedValue
- @GenericGenerator
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Collections
- Combination
- combinations
- Comparator
Archives
- Today
- Total
기록
프로그래머스_입양 시각 구하기(2) 본문
문제
programmers.co.kr/learn/courses/30/lessons/59413
풀이
GROUP BY를 이용하여 시간대별로 데이터의 개수를 세는 것은 어렵지 않으나 데이터가 없는 시간에 대해서도 0을 출력해야 한다.
이를 위해서 0~23을 데이터로 가지는 테이블을 만들어야 하며 이를 ANIMAL_OUTS 테이블과 JOIN으로 연결해야 한다. WITH를 사용하여 Common Table 표현식을 사용하였다.
WITH
테이블이름1(A, B) AS (SELECT 컬럼1, 컬럼2 FROM 테이블 이름),
테이블이름2(C, D) AS (SELECT 컬럼3, 컬럼4 FROM 테이블 이름),
테이블이름3 AS (SELECT 컬럼5, 컬럼6 FROM 테이블 이름)
SELECT A, D
FROM 테이블이름1
JOIN 테이블이름2
WHERE 테이블이름1.A = 테이블이름2.C;
테이블에서 열 이름 결정은 괄호로 묶인 이름 목록으로 결정되며 이름 목록이 생략된 경우, SELECT절의 컬럼명으로 결정된다.
이를 이용하여 아래와 같이 표현하면 0~23을 데이터로 가지는 테이블을 얻을 수 있다.
WITH TB_HOUR(HOUR) AS(
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12 UNION ALL
SELECT 13 UNION ALL
SELECT 14 UNION ALL
SELECT 15 UNION ALL
SELECT 16 UNION ALL
SELECT 17 UNION ALL
SELECT 18 UNION ALL
SELECT 19 UNION ALL
SELECT 20 UNION ALL
SELECT 21 UNION ALL
SELECT 22 UNION ALL
SELECT 23 UNION ALL
SELECT 24)
SELECT * FROM TB_HOUR;
SQL문에서도 재귀를 이용할 수 있다. 다음과 같은 쿼리를 작성하면 0~23을 데이터로 가지는 테이블을 얻을 수 있다.
WITH RECURSIVE TB_HOUR(HOUR) AS (
SELECT 0 # 초기 데이터
UNION ALL
SELECT HOUR+1 FROM TB_HOUR WHERE HOUR<23 # 추가되는 데이터
)
코드
-- 공식 문서: https://dev.mysql.com/doc/refman/8.0/en/subqueries.html
-- WITH : 공통 테이블 선언식
-- 재귀 RECURSIVE
-- 1에서 24까지
WITH RECURSIVE TB_HOUR(HOUR) AS (
SELECT 0
UNION ALL
SELECT HOUR+1 FROM TB_HOUR
WHERE HOUR<23
)
#SELECT * FROM TB_HOUR;
-- 검색
SELECT TB_HOUR.HOUR, COUNT(ANIMAL_OUTS.ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
RIGHT OUTER JOIN TB_HOUR
ON HOUR(ANIMAL_OUTS.DATETIME) = TB_HOUR.HOUR
GROUP BY TB_HOUR.HOUR;
참고자료
'코딩테스트 > SQL' 카테고리의 다른 글
프로그래머스_3월에 태어난 여성 회원 목록 출력하기 (0) | 2023.06.24 |
---|---|
프로그래머스_입양 시각 구하기(1) (0) | 2022.02.05 |
프로그래머스_보호소에서 중성화한 동물 (0) | 2021.01.28 |
프로그래머스_우유와 요거트가 담긴 장바구니 (0) | 2021.01.25 |
프로그래머스_오랜 기간 보호한 동물(2) (0) | 2021.01.25 |
Comments