https://solvesql.com/problems/multiple-medalist/

<문제 링크는 아래를 클릭해 주세요>

 

solvesql

 

solvesql.com

 

역대 올림픽 정보 데이터셋은 역대 올림픽 경기와 관련된 데이터가 들어있는 테이블로 이루어져 있습니다.

athletes 테이블에는 역대 올림픽 참가 선수의 이름이 들어 있습니다. 

events 테이블에는 종목과 경기 이름이 들어 있습니다. 

games 테이블에는 올림픽 개최 연도, 개최 도시와 시즌 정보가 기록되어 있습니다. 

records 테이블에는 역대 올림픽 참가 선수들의 신체 정보와 획득한 메달 정보가 기록되어 있습니다. 이 테이블은 다른 테이블과 매핑할 수 있는 ID 정보도 가지고 있습니다. 

teams 테이블에는 국가 정보가 기록되어 있습니다.

* 조건 *

2000년 이후의 메달 수상 기록만 고려했을 때, 메달을 수상한 올림픽 참가 선수2개 이상의 국적으로 메달을 수상한 기록이 있는 선수의 이름을 조회하는 쿼리를 작성해주세요. 조회된 선수의 이름은 오름차순으로 정렬되어 있어야 합니다.

1. 조건에 필요한 모든 컬럼을 가져오기 위해 record를 기준으로 athletes(선수 이름), games(개최 연도)를 JOIN

2. 메달을 수상한 기록이 있음 -> medal is not null /  2000년 이후의 메달 수상 기록 -> year >= 2000

⭐3. 2개 이상의 국적으로 메달을 수상한 기록이 있는 선수!

3번의 그룹핑을 정말 많이 헤맸다. 처음에 grouping을 선수의 이름을 기준으로 했는데 선수 이름을 기준으로 하면 총 record가 14명이 나온다 (이걸 해결하느라 정말 오래 걸렸음)

소스 코드:

SELECT name
FROM records as r
JOIN athletes as a ON r.athlete_id = a.id
JOIN games as g ON r.game_id = g.id
WHERE medal is not null
AND year >= 2000
GROUP BY a.id
HAVING COUNT(distinct team_id) >= 2
ORDER BY name

 

 

풀이 과정

처음 쿼리는 이랬다. (name으로 그룹핑)

근데 자꾸 정답 레코드의 개수 차이가 남

SELECT name
FROM records as r
JOIN athletes as a ON r.athlete_id = a.id
JOIN games as g ON r.game_id = g.id
WHERE medal is not null
AND year >= 2000
GROUP BY name
HAVING COUNT(distinct team_id) >= 2
ORDER BY name

 

(좌)name으로 그룹핑 했을 때 결과 / (우)athletes의 id로 그룹핑 했을 때 결과

 

Chen Jing 선수가 id로 그룹핑 했을 때는 빠지게된다. 그래서 Chen Jing을 검색하여 찾아봤음

SELECT a.id, name, game_id, team_id, medal
FROM records as r
JOIN athletes as a ON r.athlete_id = a.id
JOIN games as g ON r.game_id = g.id
WHERE name = 'Chen Jing'
AND medal is not null
AND year >= 2000

2000년 이후의 기록을 봤을때 그는 동명이인이었다... unique key로 잡아줘야하는 것의 중요성을 다시 한 번 알게되었다.

따라서 그룹핑을 athelete의 id로 잡아주어야한다. 

사소한 부분 꼭 신경쓰기 !!

+ Recent posts