일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코틀린 클래스
- 자바스크립트
- Leetcode
- oracle
- springboot
- python
- SQL 문제풀이
- spring boot
- 오라클
- java8
- MSA
- 스프링
- 스프링부트 채팅서버
- SAP ABAP
- 스프링시큐리티
- 구글로그인
- SQL프로그래머스
- 프로그래머스
- SQL
- oauth2
- kotlin 클래스
- sap ERP
- javascript
- LeetCode SQL
- js
- Spring
- 자바 스트림
- pygame
- 스프링부트
- mysql
- Today
- Total
웅겹살의 프로그래밍 삼매경
[SQL] 프로그래머스 입양 시각 구하기(2) ORACLE, MYSQL 본문
https://programmers.co.kr/learn/courses/30/lessons/59413?language=oracle
코딩테스트 연습 - 입양 시각 구하기(2)
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물
programmers.co.kr


입양 시각 구하기(1) 의 심화버전이다
1. ORACLE
가상테이블 2개 만들어서 LEFT OUTER JOIN시켜서 뽑아냈다
첫번째 가상테이블은 00시부터 23시까지 HOUR를 뽑아내다.
참고한 블로그 url 첨부한다.
https://meyouus.tistory.com/175
오라클 순번 채번 CONNECT BY LEVEL 활용하기
안녕하세요. 오라클 디비 이용 시 알아두면 유용한 쿼리가 [CONNECT BY LEVEL]입니다. Connect By Start With는 계층 쿼리로 상하 관계를 질의하는 데 사용하는데요. LEVEL은 순위를 의미합니다. 이를 응용한
meyouus.tistory.com
두번째 테이블은 입양 시각 구하기(1) 에서 HOUR와 COUNT를 뽑아낸 쿼리를 재사용했다.

WITH SET_HOUR AS
(
SELECT LEVEL - 1 as HOUR FROM DUAL CONNECT BY LEVEL <= 24
)
, SET_COUNT AS
(
SELECT
TO_CHAR(DATETIME, 'HH24') AS HOUR
,COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME, 'HH24')
)
SELECT
H.HOUR
,NVL(C.COUNT,0) COUNT
FROM
SET_HOUR H
LEFT OUTER JOIN SET_COUNT C ON H.HOUR = C.HOUR
ORDER BY H.HOUR
2. MYSQL
mysql은 2가지 방법으로 성공했다.
- WITH RECURSIVE 활용
mysql에서 오라클의 connect by level을 사용할 방법을 찾아보니까 WITH RECURSIVE을 사용하는 방법도 있다.
하단에 참고한 url 첨부한다.
https://aljjabaegi.tistory.com/549
MySql, MariaDB에서 connect by level 사용방법
MySql, MariaDB에서 connect by level 사용방법 오랜만에 포스팅에서는 MySql, MariaDB에서 connect by level 사용방법을 알아보겠습니다. connect by level 은 증가하거나 감소하는 데이터를 동적으로 생성..
aljjabaegi.tistory.com
WITH RECURSIVE SET_HOUR AS (
SELECT 0 AS HOUR
UNION ALL
SELECT 1 + SET_HOUR.HOUR
FROM SET_HOUR
WHERE SET_HOUR.HOUR < 23
)
, SET_COUNT AS
(
SELECT
HOUR(DATETIME) AS HOUR
,COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
)
SELECT
H.HOUR
,IFNULL(C.COUNT,0) COUNT
FROM
SET_HOUR H
LEFT OUTER JOIN SET_COUNT C ON H.HOUR = C.HOUR
ORDER BY H.HOUR
- SET변수와 LIMIT 활용
SET으로 변수선언하고 LIMIT을 걸어줘서 HOUR 뽑았다.
COUNT는 ORACLE과 동일하게 작성

SET @LEVEL = -1;
WITH SET_HOUR AS
(
SELECT @LEVEL := @LEVEL + 1 AS HOUR FROM ANIMAL_OUTS LIMIT 24
)
, SET_COUNT AS
(
SELECT
HOUR(DATETIME) AS HOUR
,COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
)
SELECT
H.HOUR
,IFNULL(C.COUNT,0) COUNT
FROM
SET_HOUR H
LEFT OUTER JOIN SET_COUNT C ON H.HOUR = C.HOUR
ORDER BY H.HOUR
'SQL > SQL 문제풀이' 카테고리의 다른 글
[SQL] LeetCode SQL 182. Duplicate Emails (0) | 2021.11.29 |
---|---|
[SQL] 고양이와 개는 몇 마리 있을까 (0) | 2021.07.06 |
[SQL] 프로그래머스 입양 시각 구하기(1) (2) | 2021.07.04 |
[SQL] 프로그래머스 오랜 기간 보호한 동물(2) (0) | 2021.01.28 |
[SQL] 프로그래머스 DATETIME에서 DATE로 형변환 (0) | 2021.01.28 |