해당 문제는 HackerRank에서 사용한 문제이며 모든 테이블의 자료와 출처는 Hackerank임을 밝힙니다.

해커랭크

해당 글에서는 INNER JOIN를 사용하여 푸는 문제로 그래도 처음 푸는 사람에게도 적절한 문제인 것 같습니다..

해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.

 

시작하겠습니다


Given the CITY and COUNTRY tables, query the names of all the continents (COUNTRY.Continent) and their respective average city populations (CITY.Population) rounded down to the nearest integer.
Note: CITY.CountryCode and COUNTRY.Code are matching key columns.
(CITY와 COUNTRY 두 개의 테이블이 있습니다. 모든 continents 값과 continents에 해당 하는 값의 도시 인구의 평균 값을 내림을 하여 정수로 표현하라는 문제입니다.
Note: CITY 테이블의 CountryCode와 COUNTRY테이블의 Code가 서로 연결되는 key입니다.)

이 문제에서는 두 개의 테이블이 주어졌으며 저희는 도시 인구가 필요하므로 CITY 테이블을 활용해야 합니다. 그러므로 두 개의 테이블에서 가져와야 합니다. 그러므로 JOIN을 활용해야 하며 각 continents에 해당하는 population 또한 뽑아야 하니 Group By을 사용하면 될 것 같습니다.

그리고 내림을 활용해야 하니 FLOOR()를 기억해주시면 될 것 같습니다.

 

1. CITY와 COUNTRY 테이블 확인하기

테이블이 이렇게 구성 된 것을 보아 너무 많아 좀 혼란스러울 수도 있으나, 저희는 저희가 필요한 컬럼만 보시면 됩니다.


2. INNER JOIN을 통해 테이블 합치기

우선 두 개의 테이블 먼저 합쳐 보겠습니다.

SELECT co.continent, c.population
FROM CITY c
    INNER JOIN COUNTRY co ON c.countrycode = co.code

이렇게 두 개의 테이블을 합쳐서 문제에서 원하는 contient와 population을 가져올 수 있게 되었습니다.

예를 들어 여기서 나온 127800이라는 population은 Asia에 해당하는 어느 도시의 인구 수를 뜻합니다.


3. GROUP BY와 AVG를 활용하여 해당 continents에 해당하는 평균 도시 인구 구하기

SELECT co.continent, FLOOR(AVG(c.population))
FROM CITY c
    INNER JOIN COUNTRY co ON c.countrycode = co.code
GROUP BY co.continent

이렇게 continent로 그룹화하고 population를 AVG를 사용하여 평균을 구한 후 FLOOR를 통해 소수점들을 내림해주고 정수로 바꿔 주었습니다. 

코드 결과

결과 문제에서 원하는 답이 출력 되었습니다.


이상으로 Hacker Rank 문제 풀이를 마치도록 하겠습니다.

728x90
hmm06