https://www.hackerrank.com/challenges/full-score/problem?isFullScreen=true
코드설명
INNER JOIN + COUNT + GROUP BY + DISTINCT 를 활용합니다.
상당히 좋은 문제라고 생각됩니다.
문제에서 유의할점은, SUBMISSION에서 같은 정답을 여러번 제출하는 경우를 피해야 합니다.
그러기 위해서 COUNT(DISTINCT C.CHALLENGE_ID) 에서 DISTINCT를 작성하는 것이지요.
그런데, 이 문제에서는 DISTINCT가 없어도 올바르게 작동합니다. 문제 조건에 같은 정답을 여러번 제출한다는 조건이 없기에 그렇지요.
추가로, 문제가 조금 복잡한데 구현하기 위한 편한방법은 바로 '집합'으로 생각하는 것 입니다.
일반적으로 SQL은 코딩과 다르게 절차적으로 생각하기보다는 집합으로 생각하면 좀 편한 것 같다고 느껴집니다.
INNER JOIN시 카타시안 곱이 된다는점도 유의해야합니다. 곱해지면, 하나에 LIST가 더해지는게 아닌 새로운 레코드가 생겨나는 것 입니다.
ORACLE 코드
SELECT H.HACKER_ID, H.NAME
FROM CHALLENGES C
INNER JOIN SUBMISSIONS S
ON C.CHALLENGE_ID = S.CHALLENGE_ID
INNER JOIN DIFFICULTY D
ON C.DIFFICULTY_LEVEL = D.DIFFICULTY_LEVEL AND D.SCORE = S.SCORE
INNER JOIN HACKERS H
ON H.HACKER_ID = S.HACKER_ID
GROUP BY H.HACKER_ID, H.NAME
HAVING COUNT(DISTINCT C.CHALLENGE_ID) >= 2
ORDER BY COUNT(DISTINCT C.CHALLENGE_ID) DESC, H.HACKER_ID ASC;