https://solvesql.com/problems/multiple-medalist/
2000년 이후 메달을 수상한 올림픽 참가 선수 중 2개 이상의 국적을 가지고 있는 선수의 이름을 조회.
오름차순으로 정렬.
WITH player_medal AS( --2000년 이후 메달을 딴 선수이름
SELECT r.team_id, r.event_id, r.athlete_id, a.name, r.medal
FROM records r
INNER JOIN athletes a ON r.athlete_id=a.id
INNER JOIN games g ON r.game_id=g.id
WHERE 1=1
AND r.medal IS NOT NULL
AND g.year>=2000
)
SELECT DISTINCT name
FROM player_medal
WHERE 1=1
GROUP BY athlete_id
HAVING COUNT(DISTINCT team_id)>=2
ORDER BY name
"2개 이상의 국적을 가진"
이라는 키워드를 봤을 때 막막했었는데,
HAVING절이 GORUP화된 데이터에 대한 필터링이 가능하다는 것을 깨닫고 풀 수 있었다.
GORUP BY 절에서는 처음에 name으로 했다가 틀렸다고 나와서 athlete_id(선수아이디)로 진행.
아마 동명이인이 있는 듯 하다.
스터디하시는 다른 분께서 CTE사용 없이 코드 작성하셨길래 가져와 봤다.
SELECT A.name
FROM athletes AS A
INNER JOIN records AS R ON A.id = R.athlete_id -- 선수 id 조인
INNER JOIN games AS G ON R.game_id = G.id -- 올림픽 게임 id 조인
WHERE G.year >= 2000 AND R.medal IS NOT NULL -- 2000년 이후, 메달 수상 기록만 고려
GROUP BY R.athlete_id
HAVING count(DISTINCT R.team_id) >= 2 -- 2개 이상의 국적
ORDER BY A.name
깔끔하다.