본문 바로가기
배우기/SQL

HackerRank - Challenges (조인, 서브쿼리 / WITH)_MySQL

by 인사잘해 2022. 3. 7.

안녕하세요!

 

[TABLE]

- Hackers

- Challenges

 

[문제]

각 hacker_id 와 name, 그리고 참여한 challenge의 개수를 알아내야 한다.

challenge 의 개수가 동일한 hacker의 경우 이들의 challenge 개수가

challenge 개수의 최대값보다 작으면 이들은 제외한다.

정렬은 challenge 개수가 높은 순서로, challenge 개수가 동일할 시 hacker_id 가 낮은 순서로 한다.

 

 

[제출 쿼리]

SELECT A.hacker_id, A.name, COUNT(B.challenge_id) cnt
FROM hackers A
	JOIN challenges B
	ON A.hacker_id = B.hacker_id
GROUP BY 1, 2
HAVING cnt IN ( SELECT cnt
              	FROM ( SELECT COUNT( challenge_id ) cnt 
                       FROM challenges 
                       GROUP BY hacker_id ) c
                GROUP BY cnt 
                HAVING COUNT (cnt) = 1 )
    OR cnt = ( SELECT MAX (cnt)
               FROM ( SELECT COUNT( challenge_id ) cnt 
                      FROM challenges 
                      GROUP BY hacker_id ) d )
ORDER BY cnt DESC, hacker_id

 

[WITH 문 사용]

WITH tmp AS (
    SELECT hackers.hacker_id
         , hackers.name
         , count(*) as cnt
    FROM challenges
        INNER JOIN hackers ON challenges.hacker_id = hackers.hacker_id
    GROUP BY hackers.hacker_id, hackers.name)
    
SELECT hacker_id
     , name
     , cnt
FROM tmp
WHERE cnt = (SELECT max(cnt) FROM tmp)
OR cnt in (SELECT cnt FROM tmp GROUP BY cnt HAVING count(*) = 1)
ORDER BY cnt desc, hacker_id

 

 

출처 : https://www.hackerrank.com/challenges/challenges/problem

댓글