코딩 테스트/MySQL

[HackerRank] Interviews

알밤바 2025. 8. 18. 11:02
728x90
반응형
 

Interviews | HackerRank

find total number of view, total number of unique views, total number of submissions and total number of accepted submissions.

www.hackerrank.com


문제

 

 

 

문제 풀이 방식

문제도 길고 테이블 수가 많지만 생각보다 간단한 문제이다.

문제에서 요구한 것은 다음과 같다

 

1) contest_id, hacker_id, name, total_submission, total_accepted_submissions, total_views, total_unique_views의 합계를 출력
2) 4개의 합계가 모두 0인 경우, 해당 콘테스트를 제외하고 출력
3) contest_id 기준 오름차순 정렬

 

1)

여기서 주의해야 할 점!

total_submission, total_accepted_submissions, total_views, total_unique_views의 합계를 구할 때, 모든 테이블을 다 조인하여 합계를 구하게 된다면 중복으로 합산이 될 수 있다.

 

예를 들어, 하나의 challenge_id가 submission_stats 테이블에 3개의 행, view_stats 테이블에 2개의 행이 있는데 함께 JOIN을 하게 된다면 3x2 = 6으로 중복 조합이 생기며, 이대로 SUM을 하게 되기에 중복 집계가 되는 것이다.

 

그렇기 때문에 각각 필요한 값에 대해 집계를 한 후, 그 다음 JOIN을 진행해야 한다.

→ submission_stats 테이블 기준 집계, view_stats 테이블 기준 집계 후 집계한 것끼리 JOIN

 

2) JOIN이 된 값들을 기준으로 WHERE절을 활용하여 4개의 합이 0이 아니라는 조건을 추가하고

3) ORDER BY로 contest_id 기준으로 정렬해주면 된다.

 

-- 1) 합계 구하기
SELECT B1.CONTEST_ID, B1.HACKER_ID, B1.NAME
     , B1.TOTAL_SUBMISSIONS, B1.TOTAL_ACCEPTED_SUBMISSIONS
     , B2.TOTAL_VIEWS, B2.TOTAL_UNIQUE_VIEWS
FROM (
    SELECT A1.CONTEST_ID, A1.HACKER_ID, A1.NAME
         , SUM(A4.TOTAL_SUBMISSIONS) AS TOTAL_SUBMISSIONS
         , SUM(A4.TOTAL_ACCEPTED_SUBMISSIONS) AS TOTAL_ACCEPTED_SUBMISSIONS
    FROM CONTESTS A1
    INNER JOIN COLLEGES A2 
        ON A1.CONTEST_ID = A2.CONTEST_ID
    INNER JOIN CHALLENGES A3
        ON A2.COLLEGE_ID = A3.COLLEGE_ID
    LEFT JOIN SUBMISSION_STATS A4	-- 참고) 값이 없는 challenge도 포함되도록 left join
        ON A3.CHALLENGE_ID = A4.CHALLENGE_ID
    GROUP BY A1.CONTEST_ID, A1.HACKER_ID, A1.NAME
) B1
LEFT JOIN (
    SELECT A1.CONTEST_ID, A1.HACKER_ID, A1.NAME
         , SUM(A5.TOTAL_VIEWS) AS TOTAL_VIEWS
         , SUM(A5.TOTAL_UNIQUE_VIEWS) AS TOTAL_UNIQUE_VIEWS
    FROM CONTESTS A1
    INNER JOIN COLLEGES A2 
        ON A1.CONTEST_ID = A2.CONTEST_ID
    INNER JOIN CHALLENGES A3
        ON A2.COLLEGE_ID = A3.COLLEGE_ID
    LEFT JOIN VIEW_STATS A5	-- 참고) 값이 없는 challenge도 포함되도록 left join
        ON A3.CHALLENGE_ID = A5.CHALLENGE_ID
    GROUP BY A1.CONTEST_ID, A1.HACKER_ID, A1.NAME
) B2
    ON B1.CONTEST_ID = B2.CONTEST_ID
    AND B1.HACKER_ID = B2.HACKER_ID
    AND B1.NAME = B2.NAME
WHERE B1.TOTAL_SUBMISSIONS + B1.TOTAL_ACCEPTED_SUBMISSIONS + B2.TOTAL_VIEWS + B2.TOTAL_UNIQUE_VIEWS <> 0	-- 2) 조건
ORDER BY B1.CONTEST_ID	-- 3) 정렬
;
728x90
반응형