Merge 테이블 함수
Merge 테이블 함수는 여러 테이블을 병렬로 쿼리할 수 있도록 합니다. 이를 위해 임시 Merge 테이블을 생성하고, 각 테이블의 컬럼 합집합과 공통 타입을 기반으로 이 테이블의 구조를 결정합니다.
테이블 설정
Jeff Sackmann의 테니스 데이터셋을 사용하여 이 함수를 활용하는 방법을 살펴봅니다. 1960년대까지 거슬러 올라가는 경기 기록이 들어 있는 CSV 파일을 처리하되, 각 10년대마다 조금씩 다른 스키마를 생성합니다. 또한 1990년대 스키마에는 몇 개의 컬럼을 추가합니다.
다음은 import 문입니다:
여러 테이블의 스키마
다음 쿼리를 실행하면 각 테이블의 컬럼과 해당 타입을 나란히 나열하여 차이점을 더 쉽게 확인할 수 있습니다.
차이점을 살펴보겠습니다:
- 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번으로 배정된 선수를 상대로 거둔 승리를 찾는 쿼리를 작성해 보겠습니다.
다음으로, McEnroe가 시드 3번 이하였던 경기만 찾을 수 있도록 이 경기들을 필터링한다고 가정해 보겠습니다.
이는 winner_seed가 여러 테이블에서 서로 다른 데이터 타입을 사용하기 때문에 다소 까다로운 작업입니다:
각 행에 대해 winner_seed의 타입을 확인하기 위해 variantType 함수를 사용하고, 그런 다음 내부 값을 추출하기 위해 variantElement를 사용합니다.
타입이 String인 경우 숫자로 캐스팅한 후 비교를 수행합니다.
쿼리를 실행한 결과는 아래와 같습니다.
merge를 사용할 때 행은 어떤 테이블에서 오나요?
행이 어떤 테이블에서 왔는지 알고 싶다면 어떻게 해야 할까요?
다음 쿼리와 같이 _table 가상 컬럼을 사용하여 확인할 수 있습니다.
이 가상 컬럼을 쿼리의 일부로 사용하여 walkover 컬럼의 값 개수를 셀 수도 있습니다.
walkover 컬럼이 atp_matches_1990s를 제외한 모든 행에서 NULL인 것을 확인할 수 있습니다.
walkover 컬럼이 NULL인 경우 score 컬럼에 문자열 W/O가 포함되어 있는지 확인하도록 쿼리를 업데이트해야 합니다:
score의 기본 타입이 Array(String)이면 배열을 순회하면서 W/O를 찾아야 하고, 타입이 String이면 문자열에서 W/O를 바로 검색하면 됩니다.