문제
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
💡 조건
0시부터 23시까지 count만 해주면 되는 간단한 문제처럼 보이나 단순히 조회만 하면 안된다. 데이터가 7시부터 19시까지만 존재하기 때문이다. 그렇다면 어떻게 값이 존재하지 않는 시간도 출력할 수 있을까!!!!
예시
HOUR | COUNT |
---|---|
0 | 0 |
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0 |
5 | 0 |
6 | 0 |
7 | 3 |
8 | 1 |
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
20 | 0 |
21 | 0 |
22 | 0 |
23 | 0 |
변수를 사용해서 작성하는 코드는 공부하는 식빵맘님의 게시글을 참고했다. 자세하게 작성되어 있어서 이해하는데 도움을 많이 받았다.
🔍변수
- @가 붙은 변수는 프로시저가 종료되도 유지된다.
- 변수를 선언할 때는=
을 사용한다.
- 변수를 사용할 때는;
(세미콜론)을 꼭 붙여준다.
- 변수에 대입할 때는:=
을 사용한다.
- 변수는 값을 가지고 있기 때문에 SELECT로 열 이름과 같이 출력이 가능하다.
SET @HOUR = -1;
SELECT @HOUR := @HOUR +1 as hour, (SELECT count(*)
FROM animal_outs
WHERE HOUR(DATETIME) = @HOUR) as count
FROM ANIMAL_OUTS
WHERE @HOUR < 23
SET @HOUR = -1;
SELECT @HOUR := @HOUR +1 as hour,
(SELECT count(*)
FROM animal_outs
WHERE HOUR(DATETIME) = @HOUR) as count
WHERE @HOUR < 23
재귀도 처음보는 코드인데 알아두면 언젠가 유용하게 사용할 수 있을 것 같아서 같이 작성해둔다. leo kim님의 코드 공유 및 해설과 RECURSIVE WITH문 을 참고했다.
이 글보다 더 잘 설명할 수는 없을 것 같아서 글의 일부를 가져온다. 만약 내 글을 보게 되신다면 이분의 글을 읽어보시길...
개인적으로 정리하면 WITH RECURSIVE
구문을 사용할 수 있고, 이때 테이블 명 옆에 칼럼 이름도 새로 정의할 수 있다. 재귀라고 해서 계속 돌아가는건 아니고 해당 조건을 만족할 때까지만 진행된다.
나중에 한번 작성해봐야 감이 어느정도 잡힐 것 같아서 이 글은 프로그래머스 문제 다 끝나고 나서 재작성해보고 추가해두겠다.