テーブルをセットアップする
TennisMyLife’s ATP match database を使って、この関数の使い方を見ていきます。 1960年代までさかのぼる試合を含む CSVファイルを処理しますが、年代ごとに少し異なるスキーマを作成します。 また、1990年代のデータには追加のカラムもいくつか加えます。 インポート用のステートメントを以下に示します。複数テーブルのスキーマ
次のクエリを実行すると、各テーブルのカラムとその型を横に並べて一覧表示できるため、違いを確認しやすくなります。- 1970s では、
winner_seedの型がNullable(String)からNullable(UInt8)に、scoreの型がStringからArray(String)に変わります。 - 1980s では、
winner_seedとloser_seedの型がNullable(UInt8)からNullable(UInt16)に変わります。 - 1990s では、
surfaceの型がStringからEnum('Hard', 'Grass', 'Clay', 'Carpet')に変わり、walkoverとretirementのカラムが追加されます。
merge を使った複数テーブルのクエリ
John McEnroe が第1シードの相手に勝利した試合を見つけるクエリを書いてみましょう:winner_seed はテーブルごとに使われているデータ型が異なるため、これは少し厄介です。
variantType 関数を使用して各行の winner_seed の型を確認し、続いて variantElement で実際の値を取り出します。
型が String の場合は数値にキャストしてから比較します。
クエリの実行結果を以下に示します。
merge を使用する場合、行はどのテーブルから来ているのでしょうか?
行がどのテーブルに由来するのかを知りたい場合はどうすればよいでしょうか。 これには、次のクエリに示すように_table 仮想カラムを使用できます。
walkoverカラムの値を数えるクエリの一部として使うこともできます:
walkover カラムは、atp_matches_1990s を除くすべてで NULL になっていることがわかります。
そのため、walkover カラムが NULL の場合は、score カラムに文字列 W/O が含まれているかどうかを確認するようにクエリを更新する必要があります:
score の基底型が Array(String) の場合は、配列内を走査して W/O を探す必要があります。一方、型が String の場合は、文字列内で W/O を検索するだけで済みます。