KEEP GOING

[MySQL] HackerRank : Challenges Solution 본문

code review/sql

[MySQL] HackerRank : Challenges Solution

jmHan 2021. 12. 22. 16:15
반응형

https://www.hackerrank.com/challenges/challenges/problem?isFullScreen=true 

 

Challenges | HackerRank

Print the total number of challenges created by hackers.

www.hackerrank.com

 

1. 에러난 코드 

SELECT H.hacker_id, H.name, COUNT(C.challenge_id) as challenges_created
FROM Hackers H INNER JOIN Challenges C ON H.hacker_id = C.hacker_id
WHERE MAX(challenges_created) OR COUNT(challenges_created) = 1 #문제1
GROUP BY H.hacker_id, H.name
ORDER BY COUNT(C.challenge_id) DESC, H.hacker_id

이러한 아이디어를 가지고 접근하였으나 3번째 줄에서 에러가 발생하였다. 그래서 이부분을 해결하기 위해 서브쿼리를 이용해보았다. 

 

SELECT H.hacker_id, H.name, COUNT(C.challenge_id) # (1)
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(tmp1.challenges_created)
                                FROM (SELECT COUNT(challenge_id) challenges_created 
                                      FROM Challenges GROUP BY hacker_id) tmp1) 
    # 문제1 중복이 아닌 카운트 수 조회시 오류 발생                                   
    OR COUNT(C.challenge_id) IN
                            (SELECT tmp2.challenges_created
                             FROM (SELECT COUNT(challenge_id) challenges_created 
                                   FROM Challenges 
                                   GROUP BY hacker_id) tmp2
                             GROUP BY tmp2.challenges_created
                             HAVING COUNT(tmp2.challenges_created) = 1)
ORDER BY COUNT(C.challenge_id) DESC, C.hacker_id

[# 문제1] 카운트 수가 MAX 값이 아니면서 중복인 튜플들을 제거하는 부분이 결과 출력시 나타나지 않았다. (1) 부분에서 alias를 명시하여 서브쿼리 절에 접근해주니 문제가 해결되었다. COUNT() 함수가 자주 반복되다 보니 내부적으로 구분이 안된듯 싶다.  

 

2. 정답인 코드 

SELECT H.hacker_id, H.name, COUNT(C.challenge_id) as challenges_created
FROM Hackers H INNER JOIN Challenges C ON H.hacker_id = C.hacker_id       
GROUP BY C.hacker_id, H.name
                            # 가장 많이 푼 문제 개수를 조회 
HAVING challenges_created = (SELECT MAX(tmp1.cnt)
                             FROM (SELECT COUNT(challenge_id) cnt 
                                   FROM Challenges 
                                   GROUP BY hacker_id) tmp1)
       OR challenges_created NOT IN
                            # 문제 개수 중 중복으로 카운팅되는 값을 조회 
                            (SELECT tmp2.cnt
                             FROM (SELECT COUNT(challenge_id) cnt
                                   FROM Challenges 
                                   GROUP BY hacker_id) tmp2
                             GROUP BY tmp2.cnt
                             HAVING COUNT(tmp2.cnt) >= 2)
ORDER BY challenges_created DESC, C.hacker_id
반응형
Comments