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개를 더 생성시켰다. 하나의 서브 쿼리는 도전 횟수가 가장 높은 값을 찾을 때 사용되고, 두 번째 서브 쿼리는 도전 횟수를 그룹화하여 해당 도전 횟수 그룹이 하나가 아닌 것을 제외할 때 사용하였다. 그 외에는 간단하게 출력을 요구하는 것이므로 설명은 패스.
'Language > SQL' 카테고리의 다른 글
[HackerRank][SQL] Weather Observation Station 14 - 컴도리돌이 (0) | 2022.05.21 |
---|---|
[HackerRank][SQL] Weather Observation Station 13 - 컴도리돌이 (0) | 2022.05.20 |
[HackerRank][SQL][JOIN] Basic Join, Population Census - 컴도리돌이 (0) | 2022.05.19 |
[HackerRank][SQL][JOIN] Basic Join, Ollivander's Inventory - 컴도리돌이 (0) | 2022.05.19 |
[HackerRank][SQL] Weather Observation Station 12 - 컴도리돌이 (0) | 2022.05.19 |