Merge table function
The merge table function は、複数のテーブルに対して並行してクエリを実行することを可能にします。これを実現するために、一時的な Merge テーブルを作成し、その構造をカラムのユニオンを取ることで導出し、共通の型を導出します。
テーブルの設定
私たちは、Jeff Sackmann のテニスデータセットの助けを借りて、この関数の使い方を学びます。1960年代に遡る試合を含むCSVファイルを処理しますが、各10年ごとに少し異なるスキーマを作成します。1990年代には、いくつかの追加カラムも加えます。
インポート文は以下の通りです:
複数テーブルのスキーマ
各テーブルのカラムとその型を横並びでリストするために、以下のクエリを実行できます。これにより、違いが見やすくなります。
違いを見ていきましょう:
- 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のカラムを追加します。
マージを使用した複数テーブルのクエリ
ジョン・マッケンローが第1シードの選手に勝った試合を見つけるクエリを書いてみましょう:
次に、マッケンローが第3シード以下であった試合をフィルタリングしたいとしましょう。これは少し難しいです。なぜなら、winner_seed は異なるテーブルで異なる型を使用しているからです:
variantType 関数を使用して各行の winner_seed の型をチェックし、その後 variantElement で基礎的な値を抽出します。型が String の場合、数値にキャストして比較を行います。クエリを実行した結果は以下の通りです:
マージを使用する場合、行はどのテーブルから来るのか?
行がどのテーブルから来たのか知りたい場合は、以下のクエリのように _table 仮想カラムを使用できます:
この仮想カラムを利用して walkover カラムの値をカウントするクエリの一部としても使用できます:
walkover カラムは atp_matches_1990s を除いてすべて NULL であることがわかります。walkover カラムが NULL の場合、score カラムが W/O という文字列を含むかどうかを確認するようにクエリを更新する必要があります:
score の基礎的な型が Array(String) である場合、配列を繰り返し W/O を探す必要がありますが、型が String の場合は、文字列内で直接 W/O を検索できます。