코드시그널에서 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 문에 대한 좋은 문제인거 같은 정리를 하였습니다.
'알고리즘 > 코드시그널' 카테고리의 다른 글
[CodeSignal- SQL] Group_By - Group Concat 으로 문자열 합치기 (0) | 2021.03.16 |
---|---|
[Code Signal-SQL] LIKE 정규표현식 (특수문자가 포함된 문자열 조회) (0) | 2021.03.06 |