본문 바로가기

Language/SQL

[HackerRank][SQL][JOIN] Basic Join, Challenges - 컴도리돌이

728x90
 

Challenges | HackerRank

Print the total number of challenges created by hackers.

www.hackerrank.com


Problem

해커, 도전 테이블 

Julia asked her students to create some coding challenges. Write a query to print the hacker_id, name, and the total number of challenges created by each student. Sort your results by the total number of challenges in descending order. If more than one student created the same number of challenges, then sort the result by hacker_id. If more than one student created the same number of challenges and the count is less than the maximum number of challenges created, then exclude those students from the result.

 

-> 해커 id와 해커 이름, 해커의 도전 횟수를 출력하시오. 출력을 할 때에는 도전 횟수를 내림차순 정렬로, 도전 횟수가 같을 시에는 해커 id 값을 오름차순으로 정렬하시오. 주의할 점은 도전 횟수가 가장 높은 값을 가진 해커들은 중복을 허용하지만 가장 높은 값이 아닌 도전 횟수가 중복이 될 경우 해당 데이터는 제외하시오.


Answer

select h.hacker_id ,h.name , count(c.challenge_id) as challenges_created
from hackers h 
join challenges c on h.hacker_id = c.hacker_id
group by h.hacker_id, h.name
having challenges_created = (select count(challenge_id) as max_count
                              from challenges
                              group by hacker_id
                              order by max_count desc limit 1
                             )
or challenges_created not in (select t.cnt
                              from (select count(challenge_id) as cnt from challenges group by hacker_id) t
                              group by t.cnt
                              having count(t.cnt) != 1
                             )
order by challenges_created desc, h.hacker_id asc;

* 조금 더 간결하게 표현하고 싶지만 아이디어가 떠오르지 않아 서브 쿼리를 2개를 더 생성시켰다. 하나의 서브 쿼리는 도전 횟수가 가장 높은 값을 찾을 때 사용되고, 두 번째 서브 쿼리는 도전 횟수를 그룹화하여 해당 도전 횟수 그룹이 하나가 아닌 것을 제외할 때 사용하였다. 그 외에는 간단하게 출력을 요구하는 것이므로 설명은 패스.