문제 설명

풀이 방법
아래의 쿼리는 ANIMAL_OUTS의 입양일의 시간을 추출하여, 시간대별로 순차 정렬을 하는 쿼리로 결과가 오른쪽 이미지와 같이 7시부터 19시까지만 존재하는 것으로 나왔습니다.
SELECT HOUR(DATETIME) HOUR
FROM ANIMAL_OUTS
GROUP BY HOUR
ORDER BY HOUR

그러나 우리의 문제는 0시부터 23시까지를 구하는 것이며 각 시간대별로 입양 건 수를 집계하여 결과를 시간대 순으로 정렬하는 문제입니다. 이는 로컬 변수를 활용하여 7~19시만 존재하는 HOUR(DATETIME) 이 외 시간을 새로운 행에 생성함으로 0~23시의 시간을 컬럼을 만들 수 있습니다. 그리고 스칼라 서브 쿼리를 활용하여 HOUR(DATETIME)과 새로 만든 행의 동일한 시간 대의 입양 건수를 집계하는 쿼리를 작성하여 문제를 해결할 수 있습니다.
SET
SET은 사용자 정의 변수를 설정하는 방법으로 하나의 명령문에서 변수의 값을 할당하고 나중에 다른 명령문에서 참조할 수 있습니다. 이를 통해 한 명령문에서 다른 명령문으로 값을 전달할 수 있습니다. 또한 해당 쿼리 내에서 사용이 종료되면 자동 해제되어 로컬 변수의 역할을 하도록 돕습니다. 사용 방법은 SET명령을 사용한 후 변수 앞에 @를 붙입니다. 변수를 세팅(할당) 하기 위해서는 콜론(:)과 이퀄(=)을 사용합니다. 이퀄(=)만은 안 되나요? 이퀄(=)은 이 외의 명령문에서 비교 연산자로 처리됩니다. 이 때문에 변수에 값을 할당하기 위해서는 대입 연산자인 :=를 사용해야 합니다. 아래와 같이 사용하여 '변수명 := 할당할 초기 값'을 세팅한 후 쿼리 내에서 변수를 사용할 수 있습니다.
SET @var_name := expr [, @var_name := expr];
이어서 문제를 풀면, 하나의 쿼리 구문 밖에서 SET을 통해 시간변수를 지정해주고, 0시부터 1시간씩 증가하므로 초기값은 -1을 할당합니다. WHERE 절에서 @hour 변수가 23시에서 더 이상 증가하지 않도록 조건을 겁니다. 그리고 시간 컬럼, 입양 건 수 컬럼 순으로 SELECT절을 작성합니다. 시간 컬럼은 시간이 1시간씩 증가하는 식을 할당하여 나타냅니다. 건 수 컬럼은 스칼라 서브 쿼리를 사용하여 입양 시간대와 시간 컬럼의 시간대가 같은 조건인 행을 집계하여 쿼리를 완성합니다.
문제 풀이
SET @hour := -1;
SELECT @hour := @hour + 1 AS HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS # 스칼라 서브쿼리로 변수 hour과 입양일의
WHERE HOUR(DATETIME) = @hour) AS COUNT ## 시간대가 같은 조건일 때의 입양 건수들 집계
FROM ANIMAL_OUTS
WHERE @hour < 23
실행 결과


'코딩테스트 > SQL' 카테고리의 다른 글
| [프로그래머스] IS NULL 〉Lv1. 이름이 있는 동물의 아이디 (0) | 2021.10.19 |
|---|---|
| [프로그래머스] IS NULL 〉Lv1. 이름이 없는 동물의 아이디 (0) | 2021.10.18 |
| [프로그래머스] GROUP BY 〉Lv2. 입양 시각 구하기(1) (0) | 2021.10.16 |
| [프로그래머스] GROUP BY 〉Lv2. 고양이와 개는 몇 마리 있을까 (0) | 2021.10.15 |
| [프로그래머스] GROUP BY 〉Lv2. 동명 동물 수 찾기 (0) | 2021.10.14 |
댓글