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
を検索できます。