본문 바로가기
PS/SQL

[HackerRank] Top Earners

by 행복한라이언 2024. 4. 24.
728x90
반응형

문제링크

https://www.hackerrank.com/challenges/earnings-of-employees/problem?isFullScreen=true

 

Top Earners | HackerRank

Find the maximum amount of money earned by any employee, as well as the number of top earners (people who have earned this amount).

www.hackerrank.com

 

1. 핵심

  • total_earning을 계산 > total_earning 기준 group by > total_earning 기준 내림차순 정렬 > limit 1을 활용해 가장 큰 total_earning 추출 > count(*)를 통해서 가장 큰 total_earning의 수를 센다.
  • GROUP BY의 주의점: GROUP BY에서 정의된 컬럼만 SELECT절에 사용가능하다.
  • ORDER BY의 주의점: ORDEY BY는 Alias 알지 못한다. 따라서 정렬하고자하는 컬러명의 원래 이름과 형태를 사용해야한다.
  • 윈도우 함수 사용
    • row_number() over ( partition by 그룹핑할 컬럼 order by 정렬할 컬럼)

2. 코드(MySQL)

select months * salary as total_earning, count(*)
from Employee
group by  total_earning
order by months * salary desc
limit 1;

-- 1. total_earning을 계산 > 2. total_earning 기준으로 group by로 묶음 >
-- 3. total_earning(months * salary)로 내림차순 정렬 > 4. limit 1로 가장 높은 total_eraning만 추출

-- 집계함수 count를 통해서 같은 total_earning의 수 추출한다.
-- 주의할 점은 order by는 alias 못쓴다. 따라서 원래 명칭을 사용해야함.
-- group by에서 정의된 컬렁명만 쓸 수 있고 나머지는 반드시 집계함수가 와야한다.

-- 윈도우함수 row_number() 사용해서 가장 큰 total_earning 찾기
with tmp as (
	select months * salary as total_earning, 
    		row_number() over (order by months * salary desc) as rs
    from Employee
)

select total_earning, rs
from tmp
where rs = 1;

 

728x90
반응형