solvesql - 복수 국적 메달 수상한 선수 찾기(Join, Group By)
문제 출처 : https://solvesql.com/problems/multiple-medalist/
https://solvesql.com/problems/multiple-medalist/
solvesql.com
1. 문제
난이도3, 정답률 29.81%
역대 올림픽 정보 데이터셋은 역대 올림픽 경기와 관련된 데이터가 들어있는 테이블로 이루어져 있습니다.
athletes 테이블에는 역대 올림픽 참가 선수의 이름이 들어 있습니다. events 테이블에는 종목과 경기 이름이 들어 있습니다. games 테이블에는 올림픽 개최 연도, 개최 도시와 시즌 정보가 기록되어 있습니다. records 테이블에는 역대 올림픽 참가 선수들의 신체 정보와 획득한 메달 정보가 기록되어 있습니다. 이 테이블은 다른 테이블과 매핑할 수 있는 ID 정보도 가지고 있습니다. teams 테이블에는 국가 정보가 기록되어 있습니다.
2000년 이후의 메달 수상 기록만 고려했을 때, 메달을 수상한 올림픽 참가 선수 중 2개 이상의 국적으로 메달을 수상한 기록이 있는 선수의 이름을 조회하는 쿼리를 작성해주세요. 조회된 선수의 이름은 오름차순으로 정렬되어 있어야 합니다.
예를 들어, Viktor An 선수는 2006년 토리노에서 열린 동계 올림픽과 2014년 소치에서 열린 동계 올림픽에서 메달을 수상했는데, 2006년에는 대한민국(KOR) 국적으로 메달을 수상했고 2014년에는 러시아(RUS) 국적으로 메달을 수상했습니다.
2. 조건
- 2000년이후 메달 수상기록이 있는 사람
- 2개 이상의 올림픽 참가 국적을 가지고 메달을 수상한 사람
3. 쿼리
-- 2000년 이후 메달을 수상한 참가선수가 2개 이상의 국적으로 수상한것 조회
-- 이름 오름차순
SELECT a.name
FROM athletes AS a
JOIN records AS r ON a.id = r.athlete_id
JOIN games AS g ON r.game_id = g.id
WHERE r.medal is not null
and g.year >= 2000
GROUP BY a.id
HAVING count(distinct r.team_id) >= 2
ORDER BY a.name ASC
선수정보를 가지고 있는 athletes테이블과 경기의 기록 정보를 가지고 있는 records 테이블, 올림픽의 년도 정보를 가지고 있는 games테이블을 조인하여 값을 구해야 한다.
메달 정보값의 확인과 게임의 실행년도가 2000년 이후의 값을 WHERE절의 조건으로 구해주고 group by를 통해 선수 고유의 값인 ID값으로 그루핑을 해준다.
이후 각각의 그루핑된 선수들의 teamID값을 중복을 제거해준 다음 2개 이상인 데이터를 추출하여 서로 다른 국가정보를 가지고 있는 선수들을 추출한다.