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
반응형
'코딩 테스트 > MySQL' 카테고리의 다른 글
| [LeetCode] 176. Second Highest Salary (0) | 2025.10.24 |
|---|---|
| [HackerRank] Weather Observation Station 19 (0) | 2025.08.20 |
| [HackerRank] Weather Observation Station 18 (2) | 2025.08.14 |
| [HackerRank] Occupations (3) | 2025.08.12 |
| [HackerRank] Symmetric Pairs (2) | 2025.08.11 |