본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Hacker Rank - Contest Leaderboard

by kime2 2024. 6. 13.
출처
 

Contest Leaderboard | HackerRank

Generate the contest leaderboard.

www.hackerrank.com

 

문제

The total score of a hacker is the sum of their maximum scores for all of the challenges. Write a query to print the hacker_id, name, and total score of the hackers ordered by the descending score. If more than one hacker achieved the same total score, then sort the result by ascending hacker_id. Exclude all hackers with a total score of  from your result.

 

문제에 대한 해석

  • 조회 :  hacker_id, name, and total score of the hackers
  • *  total score of a hacker is the sum of their maximum scores for all of the challenges
  • (같은 챌린지인 경우 점수가 큰것을 선택해서 도전한 챌린지별 점수 총합)
  • 정렬 : score 내림차순, hacker_id 오름차순
  • 조건 :Exclude all hackers with a total score of 0 (모든 챌린지 점수를 합했을 때 0인 해커는 제외)

풀이(MYSQL)

select 
    hacker_id, 
    name, 
    sum(max_score) as score
from 
    (select 
        h.hacker_id, 
        h.name, 
        s.challenge_id,
        max(s.score) as max_score
    from Hackers h join Submissions s
    on h.hacker_id = s.hacker_id
    group by h.hacker_id, h.name, s.challenge_id) a
group by hacker_id, name
having sum(max_score) > 0
order by score desc, hacker_id

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

 

  1. FROM 절
    1. 서브쿼리 : Hackers와 Submissions테이블을 hacker_id로 조인하여
    2. group by절 : h.hacker_id, h.name, s.challenge_id로 그룹화하여
    3. select절 : h.hacker_id, h.name, s.challenge_id와 s.score의 최대값(=max_score)을 조회하라(동일한 해커가 동일한 챌린지를 여러가 도전했다면 해당 챌린지의 최대 점수만 조회)
  2. GROUP BY 절: hacker_id, name별로 그룹화하여
  3. HAVING 절: max_score을 합산하는데, 0보다 클 경우만 필터링
  4. SELECT 절: hacker_id, name, max_score의 총합을 조회하라
  5. ORDER BY 절: score 내림차순, hacker_id오름차순