본문 바로가기
코딩테스트/SQL

[프로그래머스] GROUP BY 〉Lv4. 입양 시각 구하기(2)

by imsha 2021. 10. 17.
반응형

문제 설명

 


풀이 방법

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

 

SELECT HOUR(DATETIME) HOUR
FROM ANIMAL_OUTS
GROUP BY HOUR
ORDER BY HOUR

7시~19시 뿐

 

그러나 우리의 문제는 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

 


실행 결과

 

반응형

댓글