[GROUP BY] 입양 시각 구하기(2)

쥬쥬스·2023년 8월 26일
0

SQL

목록 보기
49/67
post-thumbnail

문제
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

💡 조건
0시부터 23시까지 count만 해주면 되는 간단한 문제처럼 보이나 단순히 조회만 하면 안된다. 데이터가 7시부터 19시까지만 존재하기 때문이다. 그렇다면 어떻게 값이 존재하지 않는 시간도 출력할 수 있을까!!!!

예시

HOURCOUNT
00
10
20
30
40
50
60
73
81
91
102
1113
1210
1314
149
157
1610
1712
1816
192
200
210
220
230

1. 변수를 사용해서 작성

변수를 사용해서 작성하는 코드는 공부하는 식빵맘님의 게시글을 참고했다. 자세하게 작성되어 있어서 이해하는데 도움을 많이 받았다.

🔍변수
- @가 붙은 변수는 프로시저가 종료되도 유지된다.
- 변수를 선언할 때는 =을 사용한다.
- 변수를 사용할 때는 ; (세미콜론)을 꼭 붙여준다.
- 변수에 대입할 때는 :=을 사용한다.
- 변수는 값을 가지고 있기 때문에 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
  1. HOUR라는 변수를 선언해준다. -1로 초기값을 설정한 이유는 0부터 출력해주어야 하기 때문이다.
SET @HOUR = -1;
  1. 첫번째 열, 시간. hour는 선언한 변수에 1씩 더해주면서 출력해준다.
SELECT @HOUR := @HOUR +1 as hour,
  1. 두번째 열, 집계된 값. 서브쿼리를 사용해서 조회하는데 이때도 변수를 사용한다. datetime의 시간만 추출해서 있는 경우 count해준다.
(SELECT count(*) 
 FROM animal_outs 
 WHERE HOUR(DATETIME) = @HOUR) as count
  1. 변수가 23보다 작은 경우까지만 출력해준다. 이 조건을 걸지 않으면 0부터 99까지 출력되므로 조건을 잘 작성해줘야한다.
WHERE @HOUR < 23

2. 재귀를 활용해서 작성

재귀도 처음보는 코드인데 알아두면 언젠가 유용하게 사용할 수 있을 것 같아서 같이 작성해둔다. leo kim님의 코드 공유 및 해설RECURSIVE WITH문 을 참고했다.


이 글보다 더 잘 설명할 수는 없을 것 같아서 글의 일부를 가져온다. 만약 내 글을 보게 되신다면 이분의 글을 읽어보시길...

개인적으로 정리하면 WITH RECURSIVE 구문을 사용할 수 있고, 이때 테이블 명 옆에 칼럼 이름도 새로 정의할 수 있다. 재귀라고 해서 계속 돌아가는건 아니고 해당 조건을 만족할 때까지만 진행된다.

나중에 한번 작성해봐야 감이 어느정도 잡힐 것 같아서 이 글은 프로그래머스 문제 다 끝나고 나서 재작성해보고 추가해두겠다.

profile
느려도... 꾸준히.....🐌

0개의 댓글