https://www.hackerrank.com/challenges/challenges/problem?isFullScreen=true
코드설명
INNER JOIN + SUBQUERY + MAX + COUNT + GROUP BY 를 활용합니다.
좋은 문제입니다.
1. 가장 최대값의 문제 개수를 구합니다.
SELECT MAX(CHALLENGE_COUNT) FROM(
SELECT COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT FROM CHALLENGES GROUP BY HACKER_ID)
2. 빈도수가 1개인 것들의 개수를 구합니다.
중요한 부분입니다. 빈도수를 다시 GROUP BY 해서 1번만 나오는 것들을 GROUP BY 하는 것 입니다.
(SELECT CHALLENGE_COUNT
FROM (SELECT HACKER_ID, COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT
FROM CHALLENGES
GROUP BY HACKER_ID)
GROUP BY CHALLENGE_COUNT
HAVING COUNT(*) = 1)
3. 기본 INNER JOIN한 코드입니다. 가능한 모든 조합이 나옵니다.
SELECT H.HACKER_ID, H.NAME, COUNT(C.CHALLENGE_ID)
FROM HACKERS H
INNER JOIN CHALLENGES C
ON H.HACKER_ID = C.HACKER_ID
GROUP BY H.HACKER_ID, H.NAME
4. 1번과 2번 코드를 COUNT(C.CHALLENGE_ID)에 합쳐줍니다.
이때 중요점은, COUNT(C.CHALLENGE_ID) 즉 문제를 낸 횟수가 최대횟수이거나 OR 빈도수가 1번 나오는 것들.
이렇게 2가지 경우의 경우 모두 TRUE를 반환하며 출력합니다. 최대횟수와 1이 만약 겹치는 경우를 걱정할 수 있지만, 그중 1개라도 겹치면 바로 출력됩니다.
SELECT H.HACKER_ID, H.NAME, COUNT(C.CHALLENGE_ID)
FROM HACKERS H
INNER JOIN CHALLENGES C
ON H.HACKER_ID = C.HACKER_ID
GROUP BY H.HACKER_ID, H.NAME
HAVING COUNT(C.CHALLENGE_ID) = (SELECT MAX(CHALLENGE_COUNT) FROM(
SELECT COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT FROM CHALLENGES GROUP BY HACKER_ID) )
OR COUNT(C.CHALLENGE_ID) IN (SELECT CHALLENGE_COUNT
FROM (SELECT HACKER_ID, COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT
FROM CHALLENGES
GROUP BY HACKER_ID)
GROUP BY CHALLENGE_COUNT
HAVING COUNT(*) = 1)
ORDER BY COUNT(C.CHALLENGE_ID) DESC, H.HACKER_ID ASC;
ORACLE 코드
정답코드1입니다.
SELECT H.HACKER_ID, H.NAME, COUNT(C.CHALLENGE_ID)
FROM HACKERS H
INNER JOIN CHALLENGES C
ON H.HACKER_ID = C.HACKER_ID
GROUP BY H.HACKER_ID, H.NAME
HAVING COUNT(C.CHALLENGE_ID) = (SELECT MAX(CHALLENGE_COUNT) FROM(
SELECT COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT FROM CHALLENGES GROUP BY HACKER_ID) )
OR COUNT(C.CHALLENGE_ID) IN (SELECT CHALLENGE_COUNT
FROM (SELECT HACKER_ID, COUNT(CHALLENGE_ID) AS CHALLENGE_COUNT
FROM CHALLENGES
GROUP BY HACKER_ID)
GROUP BY CHALLENGE_COUNT
HAVING COUNT(*) = 1)
ORDER BY COUNT(C.CHALLENGE_ID) DESC, H.HACKER_ID ASC;