반응형
문제
문제 해설
Samantha는 코딩 챌린지와 컨테스트를 통해 여러 대학의 많은 후보자를 인터뷰합니다.
contest_id, hacker_id, name과 각 컨테스트 별 total_submissions, total_accepted_submissions, total_views, total_unique_views의 합계를 출력합니다.
4개의 합계가 모두 0이면 해당 컨테스트를 결과에서 제외합니다.
참고: 특정 컨테스트는 한 개 이상의 대학에서 후보자를 선별하는데 활용될 수 있지만, 각 대학은 하나의 컨테스트만 개최합니다.
테이블 정보
풀이
- 컨테스트별 total_submissions, total_accepted_submissions, total_views, total_unique_views 값의 합계를 구해야 합니다.
- 컨테스트에 속한 챌린지를 확인하기 위해 Contests, Colleges, Challenges 테이블을 Inner Join 합니다.
- View_Stats에만 데이터가 있거나 Submission_Stats에만 데이터가 있을 경우를 위해 두 테이블은 Outer Join 합니다.
1. Contests, Colleges, Challenges 테이블을 Inner Join 합니다.
SELECT A.CONTEST_ID, A.HACKER_ID, A.NAME
, C.CHALLENGE_ID
FROM CONTESTS A
, COLLEGES B
, CHALLENGES C
WHERE A.CONTEST_ID = B.CONTEST_ID
AND B.COLLEGE_ID = C.COLLEGE_ID
;
2. 1의 쿼리와 View_Stats, Submission_Stats 테이블을 바로 Join할 경우 1 : 0 or N 관계 이기 때문에 Challenge_id의 중복된 row만큼 뻥튀기 될 수 있습니다. 먼저 Challenge_id로 그룹핑 해서 1 : 0 or 1 관계가 되도록 준비합니다.
SELECT CHALLENGE_ID
, SUM(TOTAL_SUBMISSIONS) TOTAL_SUBMISSIONS
, SUM(TOTAL_ACCEPTED_SUBMISSIONS) TOTAL_ACCEPTED_SUBMISSIONS
FROM SUBMISSION_STATS
GROUP BY CHALLENGE_ID
;
SELECT CHALLENGE_ID
, SUM(TOTAL_VIEWS) TOTAL_VIEWS
, SUM(TOTAL_UNIQUE_VIEWS) TOTAL_UNIQUE_VIEWS
FROM VIEW_STATS
GROUP BY CHALLENGE_ID
;
3. 1과 2의 쿼리를 Outer Join하고, 컨테스트 별(contest_id, hacker_id, name)로 그룹핑합니다. 합계가 모두 0일 경우를 제외하는 HAVING 조건도 추가합니다. 최종 쿼리 입니다.
SELECT A.CONTEST_ID, A.HACKER_ID, A.NAME
, SUM(S.TOTAL_SUBMISSIONS)
, SUM(S.TOTAL_ACCEPTED_SUBMISSIONS)
, SUM(V.TOTAL_VIEWS)
, SUM(V.TOTAL_UNIQUE_VIEWS)
FROM CONTESTS A
, COLLEGES B
, CHALLENGES C
, (SELECT CHALLENGE_ID
, SUM(TOTAL_SUBMISSIONS) TOTAL_SUBMISSIONS
, SUM(TOTAL_ACCEPTED_SUBMISSIONS) TOTAL_ACCEPTED_SUBMISSIONS
FROM SUBMISSION_STATS
GROUP BY CHALLENGE_ID
) S
, (SELECT CHALLENGE_ID
, SUM(TOTAL_VIEWS) TOTAL_VIEWS
, SUM(TOTAL_UNIQUE_VIEWS) TOTAL_UNIQUE_VIEWS
FROM VIEW_STATS
GROUP BY CHALLENGE_ID
) V
WHERE A.CONTEST_ID = B.CONTEST_ID
AND B.COLLEGE_ID = C.COLLEGE_ID
AND C.CHALLENGE_ID = S.CHALLENGE_ID(+)
AND C.CHALLENGE_ID = V.CHALLENGE_ID(+)
GROUP BY A.CONTEST_ID, A.HACKER_ID, A.NAME
HAVING
SUM(S.TOTAL_SUBMISSIONS) > 0 OR SUM(S.TOTAL_ACCEPTED_SUBMISSIONS) > 0
OR SUM(V.TOTAL_VIEWS) > 0 OR SUM(V.TOTAL_UNIQUE_VIEWS) > 0
ORDER BY CONTEST_ID
;
결과
반응형
'SQL' 카테고리의 다른 글
[프로그래머스] SQL 고득점 Kit : JOIN 풀이 (Oracle) (0) | 2021.03.31 |
---|---|
[HackerRank] Print Prime Number 풀이 (Oracle) (0) | 2021.03.18 |
[HackerRank] Binary Tree Nodes 풀이 (Oracle) (0) | 2021.03.16 |
[HackerRank] Weather Observation Station 20 풀이 (Oracle) (0) | 2021.03.15 |
[HackerRank] Occupations 풀이 (Oracle) (0) | 2021.03.08 |
[HackerRank] 15 Days of Learning SQL 풀이 (Oracle) (0) | 2021.02.27 |
[HackerRank] Weather Observation Station 5 풀이 (Oracle) (0) | 2021.02.26 |
댓글