[해커랭크]Contest Leaderboard

김준석·2024년 1월 5일

문제

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

문제를 요약하자면

점수테이블과 참가자 테이블이 있다.

같은 문제를 여러번 풀 수 있고 이는 점수테이블에 저장된다고 할 때
참가자별로 같은 문제 중 가장 점수가 많은 문제 점수를 다 더해서 결과치로 보여줘라~

풀이 코드

SELECT A.hacker_id, name, SUM(MAX_score) as total_score
FROM (
    SELECT hacker_id, challenge_id, MAX(score) as MAX_score
    FROM Submissions
    GROUP BY 1,2
    ) as A
LEFT JOIN Hackers B
ON A.hacker_id = B.hacker_id

GROUP BY 1,2
HAVING 1=1
    AND total_score != 0
ORDER BY total_score DESC, hacker_id;
  1. 서브쿼리 작성
    먼저 점수 테이블에서 hacker_id, challenge_id 컬럼을 기준으로 최대 score를 갖는 서브 쿼리를 작성
    FROM (
       SELECT hacker_id, challenge_id, MAX(score) as MAX_score
       FROM Submissions
       GROUP BY 1,2
       ) as A
  2. 서브쿼리와 Hackers 테이블 join
    두 테이블을 hacker_id를 기준으로 조인
    이때 점수 테이블을 기준으로 LEFT JOIN 해야 된다.
  1. 그룹화 및 조건(HVING)
    해커 아이디와 이름을 그룹화 하고
    스코어가 0점인 애들은 다 빼버림.
    그리고 정렬~

참고 :연산 후 조건은 HVING 이다!

후기

아니;;;;;;;;;;;
처음에 CTE로 만들어 봤는데 계속 해러가 났다.
이유를 모르겠음..

WITH total_score AS (
    SELECT A.hacker_id, A.challenge_id, A.name, MAX(B.score) as MAX_score
    FROM Hackers A RIGHT JOIN Submissions B 
    ON A.hacker_id = B.hacker_id
    GROUP BY 1,2
)

SELECT hacker_id, name, SUM(MAX_score) as total_sc
FROM total_score
GROUP BY 1,2
HAVING total_sc != 0
ORDER BY total_sc DESC, hacker_id;

0개의 댓글