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

해커랭크

해당 글에서는 Group by를 사용하여 푸는 문제로 그래도 처음 푸는 사람에게는 난이도가 있는 문제인 것 같습니다.

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

 

시작하겠습니다


We define an employee's total earnings to be their monthly salary * months worked, and the maximum total earnings to be the maximum total earnings for any employee in the Employee table. Write a query to find the maximum total earnings for all employees as well as the total number of employees who have maximum total earnings. Then print these values as 2 space-separated integers.
(우리는 직원의 총 수입월 급여 * 근무 개월로 정의하고, 최대 총 수입을 직원 표에 있는 모든 직원의 최대 총 수입으로 정의합니다. 쿼리를 작성하여 모든 직원의 최대 총 수입과 최대 총 수입을 가진 직원의 총 수를 구합니다. 그런 다음 이 값을 공간으로 구분된 2개의 정수로 출력합니다.)

 

문제를 요약하자면 총 수입을 구합니다. 이제 총 수입 중 가장 큰 값과 최대 총 수입을 가진 사람이 몇 명인지를 뽑아내라는 문제입니다.

 

이제 문제를 좀 더 시각화해서 봐보겠습니다. 기존 테이블 확인 해보겠습니다.

기존 테이블입니다.

 

1. 이제 여기서 총 수입을 테이블에 추가해보겠습니다.

earnings 컬럼 추가

이러한 형태의 테이블로 만들면 될 것 같습니다!! 그러므로 as(별칭)를 사용하면 훨씬 편할 것 같습니다.


2. 이제 추가된 earnings(총 수입) 컬럼이 확인 되었으니, 이러한 형식(예 : 29520 5)으로 출력 해야하니 group by를 통해 출력을 해보겠습니다.

select months * salary as earnings, 
	   count(*)
from Employee
group by earnings

이렇게 하면 문제에서 원하는 형태의 출력이 나옵니다. 이제 제일 큰 값만 가져오면 됩니다.


3. 큰 값을 가져오기 위해 DESC(내림차순)과 하나만 가져오기 위해 LIMIT 사용해보겠습니다.

select months * salary as earnings, 
       count(*)
from Employee
group by earnings
order by earnings DESC
LIMIT 1

코드 결과

이와 같이 earnings를 기준으로 제일 큰 값을 맨 위에 올린 후 LIMIT 1을 통해 맨 위의 하나의 값만 가져오게 되면 문제를 풀 수 있게 됩니다.


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

728x90
hmm06