DLife Planet

[쿼리 공부] [난이도 극악] 중급 4 입양 시각 구하기 (2) (HOUR, TO_CHAR조건에 빈값 0 채우기 PLSQL Set 함수(Mysql), Connect By(Oracle)) 본문

DataScience

[쿼리 공부] [난이도 극악] 중급 4 입양 시각 구하기 (2) (HOUR, TO_CHAR조건에 빈값 0 채우기 PLSQL Set 함수(Mysql), Connect By(Oracle))

Western_Gem 2020. 11. 19. 11:27
반응형

전 문제를 완파한 입장에서 총 3번 정도의 고비가 왔던 거 같은데 이번 문제가 첫 번째 고비입니다.

저를 포함한 우리 SQL린이들 파이팅 ㅠ

없는 값을 넣어 주는거라 쉽지 않습니다. 부족한 분석력으로 글을 써볼게요.


출처 - 프로그래머스

[해설] 

모든 프로그래머스 SQL 문제들은 테이블 명, 테이블 스키마(테이블의 구성), 쿼리 목표, 그리고 예시로 구성이 됩니다.

 

 

(지워져서 다시 올려요)

 

[쿼리 공부] 중급 3 입양 시각 구하기 (2) (PLSQL Set 함수(Mysql), Connect By(Oracle))

Group By를 사용하는 예제 3번입니다. [해설] 모든 프로그래머스 SQL 문제들은 테이블 명, 테이블 스키마(테이블의 구성), 쿼리 목표, 그리고 예시로 구성이 됩니다. MYSQL HOUR(), TO_CHAR() 함수를 쓰면

dlifeplanet.tistory.com

 

이 문제에 0~8시, 20~23시 값을 0을 추가하는 문제입니다.

재귀적으로 판단해서 없는 값을 추가하는 방법으로 이 문제는 Mysql과 Oracle 언어마다 풀이법이 다릅니다.

mysql의 경우 SET함수를 써서 @플래그를 달고 변수 선언을 하면 가능합니다.

(뭔 소린지 이해가 안 되신다면.... @hour 플래그를 그냥 변수라고 생각하고 반복문이라 생각하면 편합니다.


[정답]

Mysql 모범 답안.

SET @hour := -1;
SELECT 
 (@hour := @hour + 1) AS HOUR,  
 (SELECT COUNT(HOUR(DATETIME)) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS COUNT
 FROM ANIMAL_OUTS
 WHERE @hour < 23;

 

Oracle 모범 답안

SELECT b.time HOUR, count(ANIMAL_ID) COUNT
from (select lpad(level - 1, 2, 0) time from dual connect by level <= 24) b
inner join
     ANIMAL_OUTS a
on b.time  = to_char(a.DATETIME(+), 'hh24')
group by b.time
order by b.time

 


오라클 설명을 첨언하자면

select lpad(level - 1, 2, 0)

time from dual connect by level <= 24

시간을 정의하는 임시테이블 쿼리

on b.time  = to_char(a.DATETIME(+), 'hh24') 

실제 a테이블의 DATETIME에 있는지 여부를 확인하는 코드입니다.

select 다음의 칼럼은 b.time HOUR, count(ANIMAL_ID) COUNT 최종 목표값이구요.

group by order by 는 뭐 설명 생략할게요

 

OTL 이래도 이해가 안된다면... 그냥 저 템플릿을 쓰면 될거 같아요. 길이가 중요한게 아니라 가독성이 너무 떨어지네요. 오우 쉣...

 

 

하... 쉽지 않습니다. 양삼고백할게요. 이 쿼리는 제가 짠거 아닙니다.

 

쿼리도 너무 복잡해지고, 그냥 코드레 벨에서 0 값 넣어서 행렬에 추가하는 게 훨씬 나을 거 같네요.

(실무 입장이고요, 코테에선 이런 문제 내면 그냥 엿 먹으라는 소리니까 풀지 말고 다른 거 먼저 푸세요. 풀다가 말리면 다른 거 풀 시간도 없어짐)

반응형
Comments