관리 메뉴

JIE0025

[프로그래머스] SQL 입양시각 구하기 - GROUP BY, 변수 본문

알고리즘/프로그래머스

[프로그래머스] SQL 입양시각 구하기 - GROUP BY, 변수

Kangjieun11 2022. 3. 2. 14:39
728x90

알고리즘 코테 공부하다가

심심해서 어제 프로그래머스 SQL 몇개 풀었는데

오랜만에 블로그 쓸만한 문제가 있어서 블로그 쓰러 왔다!

(SQL 안본지 오래돼서 기초 문법 빼고 많이 까먹은 상태 ㅎㅎ,,)

 


 

문제  SQL - 입양 시각 구하기(2)

 

이문제는 몇시에 입양이 가장 활발하게 일어나는지 나타내야 하는데 

0시부터 23시까지 출력해야한다는 특이점(?) 이 있다. 

 

 

 

전체 데이터를 찍어보면 0~6시까지의 데이터는 나오지 않는 것을 확인할 수 있다. 

 

SQL을 안본지 꽤 시간이 지났는데 아주 당황스러운 문제였다.

 

 

SQL 문법 - 변수

<변수 선언과 초기화>
SET @변수이름 = 대입값;
SET @변수이름 := eodlqrkqt;

SELECT @변수이름 := 대입값;

SET 이외의 명령문에서 = 은 비교연산자이기 때문에 

SELECT 문에서 변수를 선언과 초기화 해줄 때엔 :=을 사용해야 한다. 

 

<변수 사용>
SET @s = 15;
SELECT @f := 15;

SELECT * FROM tbl WHERE id BETWEEN @s AND @f;  

 

 

이제 문법을 알았으니 문제를 풀어보자.

 

 

 

우리가 구해야하는 것은

몇시에 입양이 가장 활발하게 일어나는지 나타내야 하는데 

0시부터 23시까지 출력해야한다는것.

 

먼저 시간을 0시부터 23시까지 출력해주고,

COUNT에 대한 것은 inner select해서 출력해준다. 

 

 

1) 시간을 0시부터 23시까지 출력

먼저 hour 라는 변수를 선언하고, -1을 할당해준다음,

SELECT 문에서 1씩 증가시켜주자.

 

 

WHERE절에서 @hour이 23이 되기 전까지 동작하므로

@hour 이 22일떄 마지막으로 +1을 해주고, 23을 출력한 후 종료하는 코드이다. 

0부터 23까지 잘 나오는것을 확인했다.

 

 

 

그럼 이제 우리 animal_outs 테이블에서 각 hour이 몇번 나오는지 체크하는 쿼리문을 작성하자. 

 

WHERE절을 통해 HOUR(DATETIME) 이 @hour 값일 때 데이터가 몇개인지 COUNT(*)로 세주면 된다. 

>>   SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour AS "COUNT"

 

 

이를 조합하면,

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

 

 

 

 

코드실행  후 잘 나오는지 확인!

 

 

 

끗!

 

조만간 bfs dfs 문제 글 쓰러 와야지