Today I Learned/SQL 문제풀이

[해커랭크] Top Competitors

하나719 2020. 11. 28. 12:21
반응형

문제링크: www.hackerrank.com/challenges/full-score/problem?isFullScreen=true

 

Top Competitors | HackerRank

Query a list of top-scoring hackers.

www.hackerrank.com

Table 설명

* Hackers: 전체 hackers 정보

* Difficulty: 문제의 난이도 별 Full score 정보

* Challenges: 문제와, 문제를 제작한 Hacker 정보, 문제의 난이도 정보

* Submissions: 문제를 제출한 사람의 정보와, 제출 시 score 정보

Hackers
Difficulty
Challenges
Submissions

문제 설명

코딩테스트 제출자 중 full score 맞은 문제가 한개보다 많은 (2개 이상) 인 참가자의 hacker_id와, name을 뽑아라!

 

문제 풀이

1.  submissions table을 base로 필요한 정보를 담고 있는 테이블들을 join

  1) 제출한 문제의 full score 를 알기 위해 difficuly 테이블의 score 정보가 필요하다.

  2) difficulty level 정보가 있어야 full score 를 연결할 수 있고, 그 정보는 Challenges 테이블에 있다.

  3) hacker의 이름을 출력하기 위해 Hackers 테이블이 필요하다

 

JOIN 순서

FROM Submissions s
    INNER JOIN Challenges c ON s.challenge_id = c.challenge_id
    INNER JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
    INNER JOIN Hackers h ON s.hacker_id = h.hacker_id

2. full score 인 컬럼만 뽑기

- difficulty 테이블이 fullscore 정보를 가지고 있는데, 제출한 score가 동일하다면 Full score 임

WHERE d.score = s.score

3. hacker_id 별 full score 맞은 문제 갯수 count 하고, 2개 이상 푼 사람만 추출

- group by로 hacker_id, name 으로 묶어준 뒤, count(challenge_id) > 1 인 컬럼만 뽑아준다. 

SELECT s.hacker_id, h.name
FROM Submissions s
    INNER JOIN Challenges c ON s.challenge_id = c.challenge_id
    INNER JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
    INNER JOIN Hackers h ON s.hacker_id = h.hacker_id
WHERE d.score = s.score
GROUP BY s.hacker_id, h.name
HAVING count(s.challenge_id) > 1

4. 정렬

ORDER BY count(s.challenge_id) DESC, s.hacker_id

 

5. 최종코드

SELECT s.hacker_id, h.name
FROM Submissions s
    INNER JOIN Challenges c ON s.challenge_id = c.challenge_id
    INNER JOIN Difficulty d ON c.difficulty_level = d.difficulty_level
    INNER JOIN Hackers h ON s.hacker_id = h.hacker_id
WHERE d.score = s.score
GROUP BY s.hacker_id, h.name
HAVING count(s.challenge_id) > 1
ORDER BY count(s.challenge_id) DESC, s.hacker_id
반응형