[solvesql] 두 대회 연속으로 출전한 기록이 있는 배구 선수

2025. 12. 9. 12:40·STUDY

들어가며.

https://solvesql.com/collections/advent-of-sql-2025/

 

https://solvesql.com/collections/advent-of-sql-2025/

 

solvesql.com

solvesql에서 advent of SQL을 시작하였습니다!!

작년에 참여했을 때, 괜찮은 문제들이 많아 당시 스터디를 같이하던 팀원들과 재미있게 풀었던 기억이 있어서 이번에도 참여하였습니다.

이번 문제 중 9일차 문제가 제가 최근에 시청했던 '신인감독 김연경'에 관련된 이야기이기도 하고, 풀이법도 정리해 볼 만 하다고 생각이 들어 글을 쓰게 되었습니다. 

 

문제는 노출하면 안된다는 문구가 있어, 문제가 궁금하신 분들은 직접 풀어보시기를 추천드립니다!


오답 풀이.

해당 문제는 얼핏보면 GROUP BY 문제라고 생각하여 필요한 테이블들을 JOIN한 뒤 GROUP BY를 한 뒤 '어떻게 하지?'라고 많이들 생각하실 거 같습니다. 저 또한 처음 접근법을 그렇게 접근하다 보니 오답에 쿼리문을 처음부터 다시 짰습니다...

 

GROUP BY가 되지 않는 이유는 HAVING 절에서 COUNT() 함수를 통해 2번 이상 출전한 선수를 찾을 순 있지만, 2번 이상 출전했다고 꼭 연속으로 출전했다고 확신할 수 없었습니다.

 

올림픽이 4년마다 열려 기량을 유지하는 선수는 대부분 연속으로 출전하겠지만 전성기가 다시 찾아와 8년만에 재출전한 선수가 있을 수도 있다고 생각하였습니다.

 

실제로 GROUP BY 쿼리문으로 요청했을 때, 한국 선수는 아니지만 그런 선수들이 있었습니다.

 

정답 풀이.

저는 그래서 올림픽을 연속하여 출전한 선수를 찾기 위해 self join 방법을 생각하였습니다.

 

제가 쿼리문을 짜는 버릇상 해당 조건에 맞는 테이블을 먼저 만들고 호출하는 쿼리문을 최대한 간결하게 하려고 하기 때문에, kor_vball이라는 변수명의 테이블을 먼저 만들어 주었습니다.

 

문제에 조건에 맞게 필요한 테이블들을 join하여 '여자 배구'와 '한국 선수'의 조건들을 추가하여 필요한 컬럼들만 추출하여 테이블을 완성 시켰습니다.

 

그렇게 완성한 kor_vball 테이블을 셀프 조인 해주었을 때, 같은 선수의 정보에서 '첫 번째 테이블.year'에 4년을 더했을 때 '두 번째 테이블.year'과 같다면 연속하여 출전했다고 판단할 수 있다고 생각하였습니다.

 

해당 쿼리문을 사용한다면 올림픽을 연속하여 3번 이상 출전한 선수는 중복된 athlete_id가 있기에 DISTINCT 함수를 사용하여 중복을 제거하여 주었습니다.

 

마지막으로 선수의 이름을 추출하기 위해 athletes 테이블과 join하여 쿼리문을 마무리하였습니다.

 

고려한 점.

첫 번째로, 코로나로 인해 '도쿄 올림픽'과 같은 경우 빼고는 올림픽은 4년마다 열렸습니다. 문제에서도 조건을 '도쿄 올림픽' 이전인 '2016 리우데자네이루 올림픽'까지 주어 '4'년 주기로 연속 출전한 선수를 찾을 수 있을 것이라고 생각하였습니다.

 

두 번째로, 올림픽은 하계, 동계 올림픽이 있지만 여자 배구는 하계 올림픽에만 열리기 때문에 '4'년 주기로 찾는데 문제가 없다고 판단하였습니다. 실제로 season != 'Summer' 조건을 넣어 호출하였을 때, 데이터가 추출되지 않았습니다.

 

정답 쿼리문.

WITH kor_vball AS (
  SELECT r.*, g.year
  FROM records r
    JOIN games g ON r.game_id = g.id
    JOIN events e ON r.event_id = e.id
    JOIN teams t ON r.team_id = t.id
  WHERE e.event = 'Volleyball Women''s Volleyball' AND t.team = 'KOR'
)
SELECT DISTINCT k1.athlete_id AS id, a.name
FROM kor_vball k1
  JOIN kor_vball k2 ON k1.athlete_id = k2.athlete_id AND k1.year + 4 = k2.year
  JOIN athletes a ON k1.athlete_id = a.id

 

보완할 점.

첫 번째로, 앞서 말했던 '도쿄 올림픽과 같은 경우가 있을 때, 어떻게 쿼리문을 짜야할까?'라는 고민이 생겼습니다.

챗 GPT에게 해당 쿼리문이 아닌 다른 방법에 대해 물어보았고, ChatGPT는 LEAD함수를 사용한다면 가능하다고 이야기 해주었습니다.

 

GPT의 조언에 따라 LEAD 함수를 통해 새롭게 쿼리문을 짜보았습니다.

 

 

LEAD 함수를 통해 next_year 컬럼을 만들어 선수마다 다음 출전한 연도를 찾아주었습니다.

 

도쿄올림픽의 경우는 2021년에 열렸고, 파리올림픽의 경우는 도쿄올림픽이 밀린 것과는 무관하게 2024년에 열렸습니다.

따라서 next_year가 4년 차이보다 크거나 같고, 8년 차이보다 작다면 도쿄올림픽 같은 경우도 모두 찾아줄 수 있을 것이라고 생각하였습니다.

 

두 번째로, self join을 사용하면 시간 복잡도 면에서 좋지 않은 결과를 얻었습니다. 따라서 self join을 사용하지 않고 LEAD 함수를 통해 얻은 next_year를 조건으로 사용해주어 호출 속도를 약 4배 이상 향상 시켰습니다.

WITH kor_vball AS (
  SELECT r.*, g.year, 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
  	JOIN events  AS e ON r.event_id = e.id
  	JOIN teams   AS t ON r.team_id  = t.id
  WHERE D.event = 'Volleyball Women''s Volleyball' AND team = 'KOR'
),
with_next AS (
  SELECT athlete_id, year, name, LEAD(year) OVER (PARTITION BY athlete_id ORDER BY year) AS n_year
  FROM kor_vball
)
SELECT DISTINCT athlete_id AS id, name
FROM with_next
WHERE year + 4 <= n_year AND year + 8 > n_year

'STUDY' 카테고리의 다른 글

<SQL> 비트연산자 &  (0) 2025.12.22
<SQL> FLOOR 함수를 통한 그룹화  (1) 2025.12.18
<Figma> 피그마 기초  (0) 2025.10.16
<SQL> SELECT와 비트연산자 이해하기 - [Programmers] 언어별 개발자 분류하기  (0) 2025.10.14
<SQL> ORDER BY 이해하기 - [Programmers] 노선별 평균 역 사이 거리 조회하기  (0) 2025.10.12
'STUDY' 카테고리의 다른 글
  • <SQL> 비트연산자 &
  • <SQL> FLOOR 함수를 통한 그룹화
  • <Figma> 피그마 기초
  • <SQL> SELECT와 비트연산자 이해하기 - [Programmers] 언어별 개발자 분류하기
승화(承和)
승화(承和)
데이터를 통해 문제의 본질을 파악하고, 실행 가능한 전략으로 연결하는 취준생입니다.
  • 승화(承和)
    일상을 담다
    승화(承和)
  • TOTAL
    TODAY
    YESTERDAY
  • NOTICE

    • 데이터 수집 중입니다.
  • MENU

    • HOME
    • PROJECT
    • JOB
    • STUDY
    • DAILY
  • BEST

  • TAG

    html
    렛츠커리어
    쿼리테스트
    프로그래머스
    마케팅 플랜
    자기소개서 완성 챌린지
    포트폴리오
    아잉단
    MySQL
    SQL
  • POSTS

  • COMMENTS

  • hELLO· Designed By정상우.v4.10.4
승화(承和)
[solvesql] 두 대회 연속으로 출전한 기록이 있는 배구 선수
상단으로

@Since 2025

궁금한 점이 있으시다면 언제든지 편하게 연락 주세요.

Instagram Notion Github Tableau Mail

티스토리툴바