알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://programmers.co.kr/learn/courses/30/parts/17044
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
동명 동물 수 찾기
입양 시각 구하기(1)
입양 시각 구하기(2)
Think🤔
마지막 문제가 간단 X
Solution✍
-- HAVING 하고 WHERE의 차이점
-- HAVING은 GROUP BY 하고난 뒤 , WHERE 그 이전 전체 데이터 검색
-- 코드를 입력하세요
SELECT NAME,COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT > 1
AND NAME IS NOT NULL
ORDER BY NAME;
-- TO_CHAR 이용해서 BETWEEN
-- GROUP BY 할 때, AS조건으로 넣으면 안들어가짐 , 조건 같이 넣어야함
-- HAVING절을 이용해서 가공된 시간 BETWEEN 걸어서 사이에 넣기
SELECT TO_CHAR(DATETIME,'HH24') AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME,'HH24')
HAVING TO_CHAR(DATETIME,'HH24') BETWEEN '09' AND '20'
ORDER BY HOUR;
-- 정답 [ X ]
-- 마지막 문제 쿼리는 LEVEL 쿼리로 만들어주거나 조인 사용해야 함
SELECT TO_CHAR(DATETIME,'HH24') AS HOUR ,
COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME,'HH24')
HAVING TO_CHAR(DATETIME,'HH24') BETWEEN '00' AND '23'
ORDER BY HOUR;
-- 서브쿼리 임시테이블 만듬
-- tmp 임시테이블을 만드는데 레벨 0부터 23까지 줌
with tmp as (
select level-1 as hour
from dual
connect by level < 25
)
select * from tmp;
위의 쿼리로 조회를 하면 0~23까지 나옴
-- 정답 [ O ]
with tmp as (
select level-1 as hour
from dual
connect by level < 25
)
select a.hour
, nvl(b.count, 0)
from tmp a
left outer join
(
select to_char(datetime, 'HH24') as hour
, count(*) as count
from animal_outs
group by to_char(datetime, 'HH24')
) b
on a.hour = b.hour
order by a.hour
;
-- SELECT * FROM animal_outs WHERE to_char(datetime, 'HH24') = '07';
-- 조회가 가능하므로 조인절 해당 조건으로 준다.
그 다음 nvl이용해서 count없으면 0으로 중복이 있으면 안되므로 tmp에 left outer join을 걸어줌
Review🤩
select로 모두 union all 해서 푼 사람도 있음
union 중복되는거 없애줌
union all 전부이고 속도 더 빠름
'Algorithm' 카테고리의 다른 글
[프로그래머스] 헤비 유저가 소유한 장소 (0) | 2022.07.08 |
---|---|
[프로그래머스] 오랜 기간 보호한 동물 (1) , (2) (0) | 2022.07.07 |
[프로그래머스] Summer/Winter Coding(~2018)예산 (0) | 2022.05.06 |
[프로그래머스] 나누어 떨어지는 숫자 배열 (0) | 2022.05.06 |
[프로그래머스] 완주하지 못한 선수 (0) | 2022.03.16 |