[HackerRank] Top Competitors(다중 join)

생각하는 마리오네트·2021년 9월 22일
0

SQL

목록 보기
16/39

문제설명

Julia just finished conducting a coding contest, and she needs your help assembling the leaderboard! Write a query to print the respective hacker_id and name of hackers who achieved full scores for more than one challenge. Order your output in descending order by the total number of challenges in which the hacker earned a full score. If more than one hacker received full scores in same number of challenges, then sort them by ascending hacker_id.

Input Format

  • Hackers : The hacker_id is the id of the hacker, and name is the name of the hacker.

    ColumnType
    hacker_idInteger
    nameString
  • Difficulty : The difficult_level is the level of difficulty of the challenge, and score is the score of the challenge for the difficulty level.

    ColumnType
    difficulty_levelInteger
    scoreInteger
  • Challenges : The challenge_id is the id of the challenge, the hacker_id is the id of the hacker who created the challenge, and difficulty_level is the level of difficulty of the challenge.

    ColumnType
    challenge_idInteger
    hacker_idInteger
    difficulty_levelInteger
  • Submissions : The submission_id is the id of the submission, hacker_id is the id of the hacker who made the submission, challenge_id is the id of the challenge that the submission belongs to, and score is the score of the submission

    ColumnType
    submission_idInteger
    hacker_idInteger
    challenge_idInteger
    scoreInteger

    Sample Output

    90411 Joe

어려웠던점

1. join에서 기본키와 외래키
약 45일전에 처음 SQL에 입문했을때 기본키와 외래키에 대해서 익힌적 있었다.
하지만, 시간이 흐르고 여러 테이블들 JOIN을 하다보니 이상하게 키를 연결하여 테이블을 만들어 계속해서 에러를 만났다. 하지만 이후 Key에 대한 개념이 다시 생각이 났고 서로 기본키와 외래키의 관계에 있는 Key들끼리 연결하여 해결할 수 있었다.

2. Group by할때 SELECT행과의 연광
이때까지 group by를 할때 한가지만 사용해서 몰랐었는데 SELECT행과 항상 같은 것을 Group by 에 넣어야한다는것을 알게되었다.

3. 문제를 작은 단위로 분해하는 과정
아직까지 풀어야 하는 문제를 작은단위로 쪼개어서 생각하고, 단계별로 푸는것이 부족한거 같다.
문제를 보고 어떻게 정리하고 어떻게 접근해야할지 효율적으로 하기위해 이를 더욱 연습해야겠다.

정답

SELECT H.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 S.score = D.score AND C.difficulty_level = D.difficulty_level
GROUP BY H.hacker_id, H.name
HAVING COUNT(S.hacker_id) > 1
ORDER BY COUNT(S.hacker_id) DESC, H.hacker_id
profile
문제를해결하는도구로서의"데이터"

0개의 댓글