1. 입양 시각 구하기(2)
A. 문제
위 프로그래머스 사이트에 접속하여 문제를 확인해주세요.
B. 내 답안
-- Oracle
SELECT B.L AS HOUR,
NVL(A.COUNT, 0) AS COUNT
FROM (
SELECT TO_CHAR(DATETIME, 'HH24') AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME, 'HH24')
ORDER BY TO_CHAR(DATETIME, 'HH24')
) A,
(
SELECT LEVEL-1 AS L
FROM DUAL
CONNECT BY LEVEL <= 24
) B
WHERE A.HOUR(+) = B.L
ORDER BY B.L;
a. 회고
내 풀이
LEVEL CONNECT BY
를 사용했다.
- 번호를 매길때 사용할 수 있다는 것은 알겠지만, 완벽하게 사용법을 숙지하지는 못했다.
LEVEL
을 구한 인라인 뷰와 입양 시각을 구한 인라인 뷰를 RIGHT OUTER JOIN
했다.
- 0시부터 23시까지의 값을 구하는 문제라서 B 테이블 부분은 전부 살리고 A 테이블에 B 테이블과 매핑되는 값이 없으면 NULL로 처리되게 하는게 최선이라 생각했다.
- B 테이블의 값 중 A 테이블에 값이 없어서 NULL로 처리된 부분을 0으로
NVL
함수를 사용하여 변경하였다.
참고문헌
-- Oracle
SELECT B.L AS HOUR,
NVL(A.COUNT, 0) AS COUNT
FROM (
SELECT TO_CHAR(DATETIME, 'HH24') AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME, 'HH24')
ORDER BY TO_CHAR(DATETIME, 'HH24')
) A,
(
SELECT LEVEL-1 AS L
FROM DUAL
CONNECT BY LEVEL <= 24
) B
WHERE A.HOUR(+) = B.L
ORDER BY B.L;
내 풀이
LEVEL CONNECT BY
를 사용했다.- 번호를 매길때 사용할 수 있다는 것은 알겠지만, 완벽하게 사용법을 숙지하지는 못했다.
LEVEL
을 구한 인라인 뷰와 입양 시각을 구한 인라인 뷰를RIGHT OUTER JOIN
했다.- 0시부터 23시까지의 값을 구하는 문제라서 B 테이블 부분은 전부 살리고 A 테이블에 B 테이블과 매핑되는 값이 없으면 NULL로 처리되게 하는게 최선이라 생각했다.
- B 테이블의 값 중 A 테이블에 값이 없어서 NULL로 처리된 부분을 0으로
NVL
함수를 사용하여 변경하였다.
참고문헌
GROUP BY. 코딩테스트 연습 - 입양 시각 구하기(2) | 프로그래머스 (programmers.co.kr). Programmers. (accessed Oct 16, 2021)
Ghost