SQL 공부

HackerRank로 SQL 공부하기 - Challenges

데이터분석가_안졍 2023. 12. 29. 15:24
728x90

1. hacker_id, name, 각 학생별 Challenges에 문제를 만든 개수를 출력

2. 각 학생별 Challenges에 문제를 만든 개수를 기준으로 내림차순 정렬

3. 위의 조건 중 같은 개수가 있다면 hacker_id로 정렬

4. 최대값은 같은 값이 중복되도 출력

5. 각 학생별 Challenges에 문제를 만든 개수의 최대값보다 작은 개수 중 같은 값이 있는 경우

출력에서 해당 값 모두 제외


 

1. hacker_id, name, 각 학생별 Challenges에 문제를 만든 개수를 출력

2. 각 학생별 Challenges에 문제를 만든 개수를 기준으로 내림차순 정렬

3. 위의 조건 중 같은 개수가 있다면 hacker_id로 정렬

SELECT C.hacker_id, H.name, count(C.hacker_id) as challenges_created
FROM Challenges C
LEFT JOIN Hackers H ON C.hacker_id = H.hacker_id
GROUP BY C.hacker_id, H.name
ORDER BY challenges_created DESC, C.hacker_id

 

4. 최대값은 같은 값이 중복되도 출력

SELECT C.hacker_id, H.name, count(C.hacker_id) as challenges_created
FROM Challenges C
LEFT JOIN Hackers H ON C.hacker_id = H.hacker_id
GROUP BY C.hacker_id, H.name
HAVING challenges_created = (SELECT max(sub2.challenges_max)
                                                   FROM (
                                                                 SELECT count(hacker_id) as challenges_max FROM Challenges                                                                            GROUP BY hacker_id
                                                               ) sub2)
ORDER BY challenges_created DESC, C.hacker_id

 

5. 각 학생별 Challenges에 문제를 만든 개수의 최대값보다 작은 개수 중 같은 값이 있는 경우 출력에서 해당 값 모두 제외

SELECT C.hacker_id, H.name, count(C.hacker_id) as challenges_created
FROM Challenges C
LEFT JOIN Hackers H ON C.hacker_id = H.hacker_id
GROUP BY C.hacker_id, H.name
HAVING challenges_created = (SELECT max(sub1.challenges_max)
                                                   FROM (
                                                                 SELECT count(hacker_id) as challenges_max FROM Challenges                                                                            GROUP BY hacker_id
                                                               ) sub1)
OR challenges_created IN (SELECT sub2.challenges_created
                                             FROM (
                                                            SELECT count(*) as challenges_created FROM Challenges
                                                            GROUP BY hacker_id
                                                          ) sub2
                                             GROUP BY sub1.challenges_created
                                             HAVING count(*) = 1)
ORDER BY challenges_created DESC, C.hacker_id

 

with을 활용하여 풀어보자...

WITH COUNTER AS (SELECT H.hacker_id, H.name, count(*) as challenges_created
                 FROM Challenges C
                 JOIN Hackers H ON C.hacker_id = H.hacker_id
				GROUP BY H.hacker_id, H.name)

select counter.hacker_id, counter.name, counter.challenges_created 
from counter 
where counter.challenges_created = (select max(counter.challenges_created) from counter) 
or counter.challenges_created in (select counter.challenges_created from counter 
group by counter.challenges_created 
having count(*) = 1) 
order by counter.challenges_created desc, counter.hacker_id​