반응형

www.hackerrank.com/challenges/interviews/problem

 

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

해결 방법 : 서브 쿼리 JOIN

  • Submission_Stats와 View_Stats에서 각각 chellenge_id로 GROUP을 묶어주며 데이터를 sum해주고, 메인 쿼리에서다시 한 번 contest_id로 GROUP하여 sum해줌으로써, contest_id에 대한 전체 데이터 sum을 구하게 된다.
  • 유의해야 할 점은, Submission_Stats, View_Stats는 LEFT JOIN을 해줘야 한다...(이거 때문에 헤맸다..)
    • 현재 코드를 예로 들면) 만약 INNER JOIN으로 진행할 시, Submission_Stats에는 없는 challenge_id가 View_Stats에는 있다면 해당 challenge_id에 해당하는 total_views와 total_unique_view는 계산되지 않는다. 반대의 경우도 마찬가지이다. 따라서 이 두 table을 Challenges table로 LEFT JOIN 해줌으로써 challenge_id를 유지해야 한다.

 

SELECT ct.contest_id, ct.hacker_id, ct.name, sum(ss.ts), sum(ss.tas), sum(vs.tv), sum(vs.tuv)
FROM contests as ct
JOIN colleges as cl on ct.contest_id = cl.contest_id
JOIN challenges as ch on cl.college_id = ch.college_id
LEFT JOIN ( -- total_submission and total_accepted_submission for a challenge
    SELECT challenge_id, sum(total_submissions) as ts, sum(total_accepted_submissions) as tas
    FROM submission_stats
    GROUP BY challenge_id
) as ss on ch.challenge_id = ss.challenge_id
LEFT JOIN ( -- total_views and total_unique_views for a challenge
    SELECT challenge_id, sum(total_views) as tv, sum(total_unique_views) as tuv
    FROM view_stats
    GROUP BY challenge_id
) as vs on ch.challenge_id = vs.challenge_id
GROUP BY ct.contest_id, ct.hacker_id, ct.name
HAVING sum(ss.ts) + sum(ss.tas) + sum(vs.tv) + sum(vs.tuv) != 0
ORDER BY ct.contest_id;

 

반응형

'IT study > SQL' 카테고리의 다른 글

New Companies (+ 형 변환)  (0) 2021.04.22
Binary Tree Nodes  (0) 2021.04.18
Occupations (SET, CASE)  (0) 2021.04.17
15 days of learning SQL  (0) 2021.04.15
The PADS (CONCAT, SUBSTR)  (0) 2021.04.13

+ Recent posts