알고리즘/코드시그널

[Code Signal-SQL] Group By 관련 문제

cafe-jun12 2021. 3. 13. 16:43
반응형

코드시그널에서 SQL 문제중 Group By 활용 좋은 문제가 있어 정리를 해보려고 합니다. 문제는 아래와 같습니다. 

 

동영상 컬렉션을 확장하려고 하지만 실제로 기본 설정이 없으므로 어디서 시작해야 할지 잘 모르겠습니다. 고민 끝에 자신이 이미 소유하고 있는 영화와 다소 최근에 영화를 찍은 수상 경력이 있는 감독들로부터 더 많은 영화를 찾는 것으로 시작해야 한다고 판단한다.

영화를 처음부터 볼 수 있는 감독들을 찾기 위해 이미 소유하고 있는 모든 영화의 데이터베이스를 만들어 동영상에 저장했습니다.정보 테이블. 이 테이블은 다음과 같은 구조를 가지고 있습니다.

 

  • title: 영화 제목;
  • director: 이 영화의 감독;
  • year: 영화가 개봉된 연도;
  • oscars: 이 영화가 받은 아카데미 상의 수

SQL 조건 

  • 그들은 2000년 이후(>)에 영화를 찍었다.
  • 이 영화들이 받은 오스카상의 총 상수는 2개 이상(>= 가 아닌 > )이다.
  • 표는 이사 이름별로 오름차순으로 정렬해야 한다.

입력값 

title director year oscars
BoBoiBoy: The Movie Nizam Razak 2016 0
Inception Christopher Nolan 2010 4
Interstellar Christopher Nolan 2014 1
Munna Bhai M.B.B.S. Rajkumar Hirani 2003 0
My Dear Brother Ertem Egilmez 1973 0
Rocky John G. Avildsen 1976 3
The Nights of Cabiria Federico Fellini 1957 1
The Sixth Sense M. Night Shyamalan 1999 6
The Sixth Sense M. Night Shyamalan 1999 6
Tokyo Story Yasujirô Ozu 1953 0
Yojimbo Akira Kurosawa 1961 1

 

결과 값 

director
Christopher Nolan

 

 

가장 처음에 생각난 쿼리는 where 로 조건을 나누어서 출력을 하면되지 않을까 생각을 했었는데 자세히 입력값을 보면 

감독이 중복이 되어 있고 그 감독에 대한 총 오스카 상에대한 조건을 묻고있어 감독별 오스카상을 받은 회수를 group by 로 나타낸뒤 having으로 조건을 sum(oscars) > 2 로 작성하였다. 그러면 year 이 2000 이후에 대한 조건을 어떻게 부여를 해야하는가 ?? 

 

SQL 실행순서에 대한 내용을 생각해보면 FROM -> WHERE -> GROUP BY 이다 WHERE 절에서 year > 2000 을 작성하면 Group By 가기전 년도에 대한 내용을 걸러낼수가 있다. 종합을해보면 쿼리는 아래와 같이 결론낼수 있다 

 

select director
from moviesInfo
where year > 2000
group by director 
having sum(oscars) > 2
order by director asc;

 

필자가 해당 문제를 접근하고 해결하면서 GROUP BY 문에 대한 좋은 문제인거 같은 정리를 하였습니다. 

반응형