테이블 설정
TennisMyLife’s ATP match database를 활용해 이 함수를 사용하는 방법을 살펴보겠습니다. 1960년대까지 거슬러 올라가는 경기 데이터가 담긴 CSV 파일을 처리하되, 각 10년 단위로 스키마를 조금씩 다르게 만들겠습니다. 또한 1990년대 데이터에는 추가 컬럼 몇 개를 더하겠습니다. 가져오기 SQL 문은 아래와 같습니다:여러 테이블의 스키마
다음 쿼리를 실행하면 각 테이블의 컬럼과 타입을 나란히 표시할 수 있어 차이점을 더 쉽게 확인할 수 있습니다.- 1970년대 데이터에서는
winner_seed의 유형이Nullable(String)에서Nullable(UInt8)로,score는String에서Array(String)로 변경됩니다. - 1980년대 데이터에서는
winner_seed와loser_seed가Nullable(UInt8)에서Nullable(UInt16)로 변경됩니다. - 1990년대 데이터에서는
surface가String에서Enum('Hard', 'Grass', 'Clay', 'Carpet')로 변경되고,walkover와retirement컬럼이 추가됩니다.
merge를 사용해 여러 테이블 쿼리하기
John McEnroe가 1번 시드를 받은 선수를 상대로 이긴 경기를 찾는 쿼리를 작성해 보겠습니다:winner_seed에 사용하는 유형이 서로 다르기 때문에 조금 더 까다롭습니다:
winner_seed의 유형을 확인하기 위해 variantType 함수를 사용한 다음, 실제 값을 추출하기 위해 variantElement 함수를 사용합니다.
유형이 String이면 숫자로 CAST한 다음 비교합니다.
쿼리 실행 결과는 아래와 같습니다.
merge를 사용할 때 행은 어느 테이블에서 가져옵니까?
행이 어느 테이블에서 가져오는지 확인하려면 어떻게 해야 할까요? 다음 쿼리와 같이_table 가상 컬럼을 사용하면 됩니다:
walkover 컬럼 값의 개수를 셀 수 있습니다:
walkover 컬럼은 atp_matches_1990s를 제외한 모든 항목에서 NULL인 것을 확인할 수 있습니다.
walkover 컬럼이 NULL인 경우 score 컬럼에 문자열 W/O가 들어 있는지 확인하도록 쿼리를 수정해야 합니다:
score의 기본 유형이 Array(String)이면 배열을 순회하며 W/O를 찾아야 하고, 유형이 String이면 문자열에서 W/O를 바로 찾으면 됩니다.