susinlee 님의 블로그

[241213] TIL 본문

학습/TIL

[241213] TIL

susinlee 2024. 12. 13. 21:19

오늘 QCC 본거 정리하자. 일단 둘 다 패스했다. 2번 문제를 3가지 방식으로 풀었는데 한 가지 더 추가해서 4가지로 풀어보고 서브상관쿼리와 윈도우함수에 대해 복습하는 시간을 갖자.

 

 

문제: 각 대륙에서 인구가 가장 많은 도시를 조사해야한다. 도시 이름, 국가 이름, 대륙, 도시 인구수를 출력하자

 

단계별 풀이 

1. 두 테이블을 조인해주자. city.countrycode와 country.code를 연결하고 대륙별로 group by 한 후 city의 인구 수 중 가장 큰 애들만 가져오자.

 

2. 이를 하나의 테이블로 보고 조인으로 먼저 풀어보자

해당 테이블을 sub으로 city와 country가 합쳐진 테이블에 country.continent 를 기준으로 JOIN해주자

 

다음 조건절로 마무리 (sub max(city.population) 컬럼에 별칭)

 

조인으로 풀어봤고.. 조인 말고 WHERE절로 풀어보자

아까 대륙별 가장 큰 도시 인구를 구한 테이블을 sub쿼리로 조건절에서 비교한다

 

서브쿼리가 컬럼 2개를 반환하니 맞춰서 2개를 비교해준다

 

다음으로는 상관 서브쿼리로 풀어보자.

상관 서브쿼리는 city의 population이 각 대륙별 가장 큰 값과 일치해야 한다

그리고 대륙별로 구해줘야 하니 조건절에서 메인쿼리와 연결해준다

 

메인 쿼리를 작성해보자

 

결과는 같게 나온다. 다만 메인쿼리의 행마다 서브쿼리에서 계산을 하기 때문에 시간복잡도가 제곱이 되어버린다.

 

앞서 본 쿼리와 서브 상관쿼리의 런타임을 보면 크게 차이나는 것을 확인할 수 있다

 

마지막으로 윈도우 함수로 풀어보자. 랭크 함수를 이용하면 될 것 같다

윈도우 함수의 구조는 함수 () OVER (PARTITION BY 컬럼 ORDER BY 컬럼 ROW/RANGE a AND b) 인데

여기서는 대륙별로 파티션을 나누고 인구수를 내림차순 정렬하면 될 것 같다.

 

이제 이 테이블을 인라인뷰로 보내서 조건절로 랭킹 1위만 뽑아보자

 

끝...

총 4가지 방법으로 풀어보았다.

'학습 > TIL' 카테고리의 다른 글

[241216] TIL  (0) 2024.12.16
[241213] WIL  (0) 2024.12.13
[241212] TIL  (0) 2024.12.12
[241211] TIL - 시간복잡도 정리  (0) 2024.12.11
[241210] TIL  (2) 2024.12.10