SQL 기초(11) - 다중 Join 및 having by

SQL 연습

목록 보기
11/11
post-thumbnail

Hackerrank- Top Competitors

다중 Join 및 having by 구문 사용 문제

두 과목 이상 만점을 받은 해커들의 아이디와 이름을 출력하시오. 만점을 받은 과목 수로 내림차수, 만약 과목 수가 같다면 아이디 오름차순으로

Hacker

Difficulty

Challenges

Submissions

  1. 각 테이블 조인하기: Submissions 테이블을 통해 각 테이블들을 연결할 수 있으므로 Submissions 테이블부터 inner join을 시작한다.
from Submissions S
inner join challenges C on S.challenge_id = C.challenge_id
inner join difficulty D on C.difficulty_level = D.difficulty_level
inner join hackers H on S.hacker_id = H.hacker_id
  1. 제출한 점수와 난이도 점수(만점)이 같다는 조건을 where절에 명시한다.
where S.score=D.score
  1. 만점 받은 과목의 수를 세야하므로 grouping을 한다. hacker_id와 name을 반환해야하므로 이 둘로 group by한다.
group by H.hacker_id, H.name
  1. 두 과목 이상 만점받은 해커들을 추려야하므로 group by절에 조건을 건다.
having count(distinct S.submission_id) > 1  #긴 count구에 Alias를 안 붙인건 select문에서 안 써서 ㅠㅠ
  1. 만점 과목 수 내림차순, 해커 아이디 오름차순으로 정렬한다
order by count(distinct S.submission_id) DESC, H.hacker_id ASC  #ASC 생략가능
  1. 필요한 칼럼을 Select 한다.
Select H.hacker_id, H.name
  1. SQL문 순서에 맞게 정리
select H.hacker_id, 
H.name

from submissions S 
inner join challenges C on S.challenge_id = C.challenge_id
inner join difficulty D on C.difficulty_level = D.difficulty_level
inner join hackers H on S.hacker_id = H.hacker_id

where S.score = D.score

group by H.hacker_id, H.name 

having count(distinct S.submission_id)>1

order by count(distinct S.submission_id) DESC, hacker_id ASC;
profile
데이터 어린이의 아둥바둥 메모장

0개의 댓글