[Hackerrank] SQL - Top Competitors

DMIS·2022년 3월 5일
0

SQL

목록 보기
28/48
post-thumbnail

문제

풀이

3개 이상의 테이블을 조인해보는 것은 처음이라 어떻게 해야할 지 잘 몰랐는데 그냥 join해보니까 어찌저찌 되긴 했다.

테이블마다 공통적으로 가지고 있는 키를 참고하여 join 조건을 걸어주고, 한 문제(challenge)에서 만점을 받은 해커는

  • 두 테이블 challenges & difficulty의 difficulty_level이 같아야 한다.
  • 두 테이블 submissions & difficulty의 score가 같아야 한다.

위의 두 사항을 만족시켜야 하므로 where 절을 사용하여 해결하였다.
또한, hacker_id, name별로 count를 해야하기 때문에 group by 구문을 사용하였다.

  • 어디서 봤는데 group by를 사용할 때 select 절에서 집계함수가 나오기 전에 있는 열들은 무조건 group by에 들어간다고 생각하지 않고 넣으라고 했다.
  • 또한 2개 이상의 문제에서 만점을 받은 해커를 골라내야하므로 having 절을 사용하였다.
select t4.hacker_id, t4.name 
from submissions as t1
join challenges as t2 on t1.challenge_id = t2.challenge_id
join difficulty as t3 on t2.difficulty_level = t3.difficulty_level
join hackers as t4 on t1.hacker_id = t4.hacker_id
where t2.difficulty_level = t3.difficulty_level and t1.score = t3.score
group by t4.hacker_id, t4.name
having count(t4.hacker_id)>1
order by count(t4.hacker_id) desc, t4.hacker_id
profile
Data + Math

0개의 댓글