일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 다중 JOIN
- 파이썬
- 결측값
- 데이터리안 웨비나
- GROUPBY
- hackerrank
- matplotlib
- MySQL
- PostgreSQL
- 머신러닝
- seaborn
- Oracle
- not in
- airflow 설치
- SUM
- 프로그래머스
- having
- SQL
- join
- solvesql
- mysql :=
- TRUNCATE
- 데이터분석
- pandas
- SQLite
- 전처리
- 그로스해킹
- Round
- 데이터시각화
- Limit
Archives
- Today
- Total
Milky's note
[프로그래머스] 입양 시각 구하기(2) 본문
오늘은 MySQL의 CTE(Common Table Expression) 공통 테이블 표현식에 대해서 알아보도록 한다.
나름 SQL 코딩 테스트가 쉽다고 생각했었는데 .. 킥킥
처음 보는 문법이 나와서 정리하려고 한다.
그 문제는 바로바로 다음이다.
먼저, CTE는 MySQL 쿼리문 내에서 여러번 참조될 수 있도록 만들어진 임시 테이블이라고 볼 수 있다.
오라클로 비유하자면 Connect by 와 같은 기능을 한다.
SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 27;
문법은 다음과 같다.
[RECURSIVE] 에 표시를 한 이유는 RECURSIVE가 있으면 재귀, 없으면 비재귀 호출을 한다.
WITH [RECURSIVE] TABLE AS(
SELECT 초기값 AS 컬럼별명1
UNION ALL
SELECT 컬럼별명1 계산식 FROM 테이블명 WHERE 조건문)
쿼리 문법은 풀어서 쓰면 어려우니까, 프로그래머스의 문제로 예시를 들어보면 다음으로 나타낼 수 있다.
WITH RECURSIVE TEMP AS (
SELECT 0 AS h
UNION ALL
SELECT h+1 FROM TEMP WHERE h < 23
)
시간 마다 입양 건이 얼마나 들어오나를 계산하는 문제였는데, 그냥 group by와 count로 수행하였는데 오류가 발생했다. 도대체 뭐가 문제지 했는데, 입양건이 없는 시간도 포함해서 0시~23시의 입양건을 보여주어야한다.
내가 처음에 수행한 쿼리는 07시~19시 밖에 없으니 당연히 오류가 발생하였다...ㅜ
그래서 with recursive를 사용하여 시간대별 list 테이블을 만들고 이를 기존 가지고 있던 테이블과 Join시켜서 결과를
출력해야한다. !!!!!
WITH RECURSIVE TEMP AS (
SELECT 0 AS h
UNION ALL
SELECT h+1 FROM TEMP WHERE h < 23
)
SELECT h, count(HOUR(DATETIME))
FROM TEMP
LEFT JOIN ANIMAL_OUTS
ON h = HOUR(DATETIME)
group by h
order by h;
[참고] MySQL Join
'SQL > SQL 코딩 테스트-프로그래머스' 카테고리의 다른 글
[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2023.05.12 |
---|---|
[프로그래머스] 중성화 여부 파악하기 (0) | 2021.12.27 |
Comments