본문 바로가기

코딩일기

SQL 코드카타 175 - Contest Leaderboard

https://www.hackerrank.com/challenges/contest-leaderboard/problem?isFullScreen=true

 

Contest Leaderboard | HackerRank

Generate the contest leaderboard.

www.hackerrank.com

 

Column Type
hacker_id Integer
name Integer

 

Hackers 테이블:

  • hacker_id : 해커의 id
  • name : 해커의 이름

 

Column Type
submission_id Integer
hacker_id Integer
challenge_id Integer
score Integer

 

Submissions 테이블:

  • submission_id : 제출물의 id
  • hacker_id : 제출물을 작성한 해커의 id
  • challenge_id : 제출물이 속한 챌린지의 id
  • score : 제출물의 점수

Julia는 지난 코딩 대회에서 당신이 도와준 덕분에 이번 도전 과제도 맡기고 싶어 합니다!

해커의 총 점수는 모든 챌린지에서 얻은 최대 점수의 합입니다. 해커의 hacker_id, name, 그리고 총 점수를 내림차순으로 정렬하여 출력하는 쿼리를 작성하세요. 만약 여러 해커가 동일한 총 점수를 얻었다면, hacker_id를 오름차순으로 정렬합니다. 총 점수가 0인 해커는 결과에서 제외합니다.

 

select
    hacker_id,
    challenge_id,
    max(score) max_challenge_score
from Submissions
group by hacker_id , challenge_id

 

해커별로 제출한 챌린지 최고점수를 출력하기 위해서 hacker_id와 challenge_id로 그룹화하고 score의 최대값을 구한다.

 

select
    hacker_id,
    sum(max_challenge_score)
from
(select
    hacker_id,
    challenge_id,
    max(score) max_challenge_score
from Submissions
group by hacker_id , challenge_id) a
group by hacker_id

 

위의 쿼리를 서브쿼리로 하고 다시 한번 그룹화해서 해커별로 획득한 최고 점수들의 합계를 구한다.

 

select
    h.hacker_id,
    h.name,
    ss.sum_score
from Hackers h
inner join
(select
    hacker_id,
    sum(max_challenge_score) sum_score
from
(select
    hacker_id,
    challenge_id,
    max(score) max_challenge_score
from Submissions
group by hacker_id , challenge_id) a
group by hacker_id) ss on h.hacker_id = ss.hacker_id

 

Hackers 테이블과 결합하고 해커의 id, 이름, 획득한 점수를 출력한다.

 

select
    h.hacker_id,
    h.name,
    ss.sum_score
from Hackers h
inner join
(select
    hacker_id,
    sum(max_challenge_score) sum_score
from
(select
    hacker_id,
    challenge_id,
    max(score) max_challenge_score
from Submissions
group by hacker_id , challenge_id) a
group by hacker_id) ss on h.hacker_id = ss.hacker_id
where ss.sum_score != 0
order by ss.sum_score desc, h.hacker_id

 

총점수로 내림차순, 점수가 같은 경우 hacker_id로 오름차순 정렬하고 총점수가 0인 해커들은 제외해주면 완료!

 

어제 풀었던 문제보다 간단한것같기도 하고...