출처: https://www.hackerrank.com/challenges/contest-leaderboard/problem?isFullScreen=true
해커의 총점은 모든 과제에서 얻은 최고 점수의 합입니다. 해커 ID , 이름 , 총점을 점수 순으로 내림차순 정렬하여 출력하는 쿼리를 작성하세요. 총점이 같은 해커가 여러 명인 경우, 해커 ID를 기준으로 오름차순 정렬하세요 . 총점이 0 인 해커는 제외하세요.결과에서.
내가 한 풀이
SELECT h.hacker_id, h.name, SUM(s.score)
From Hackers h
JOIN Submissions s
ON h.hacker_id = s.hacker_id
GROUP BY h.hacker_id, h.name
HAVING SUM(s.score)>= 0
ORDER BY SUM(s.score) DESC;
트러블 슈팅
우선 맨처음에 GROUP BY절에 두개 컬럼이 들어가야 한다.
SELECT 절에 집계 함수(SUM, AVG 등)를 제외한 컬럼이 있다면, 그 컬럼들은 반드시 GROUP BY 절에 포함되어야 한다.
더 나아가 s.score->SUM(s.score)으로 수정해야 총점을 구한다.
HAVING 절의 비효율성 -> 이것도 > 0 이렇게 수정해야 한다.
그리고 중복 제출 중 최고점만 합산을 하기 위해선 서브 쿼리도 써야 한다.
바뀐 코드문
서브쿼리: 해커별, 문제별 최고 점수만 추출
JOIN (
SELECT hacker_id, challenge_id, MAX(score) AS max_score
FROM Submissions
GROUP BY hacker_id, challenge_id
) s
전체 코드문
SELECT h.hacker_id, h.name, SUM(max_score) AS total_score
FROM Hackers h
JOIN (
SELECT hacker_id, challenge_id, MAX(score) AS max_score
FROM Submissions
GROUP BY hacker_id, challenge_id
) s
ON h.hacker_id = s.hacker_id
GROUP BY h.hacker_id, h.name
HAVING SUM(max_score) > 0
ORDER BY total_score DESC, h.hacker_id ASC;