BigQueryのテーブル内のデータを更新することはできず、追加メカニズムのみをサポートしているため、毎月新しいテーブルを作成することにしました。したがって、2012年のテーブルは(tbl_012012
、tbl_022012
、tbl_032012
、...tbl_122012
)。各レコードは、日付timestamp
とともに文字列として保存されます。
さて、私のアプリケーションが2012年1月からの範囲のレコードをフェッチしたい場合(tbl_012012
)から2012年3月(tbl_032012
)、BigQuery APIは単一のSQL範囲クエリを介して目的のテーブルを自動的にトラバースしますか、それとも各クエリ結果を取得してそれらをまとめるために追加のアプリケーションコードを使用して複数のSQLクエリを作成する必要がありますか?
1つのSQLクエリで複数のテーブルを参照できます。 FROM句で各テーブルをコンマで区切るだけで、言及されているすべてのテーブルをクエリできます。
テーブルワイルドカード関数を使用することもできます。 StandardSQLの docs の例を次に示します。
SELECT
name
FROM
mydata.people
WHERE
age >= 35
AND
(_TABLE_SUFFIX BETWEEN '20140325' AND '20140327')
そして、これがLegacySQLの同様の例です( docs )。
SELECT
name
FROM
(TABLE_DATE_RANGE([mydata.people],
TIMESTAMP('2014-03-25'),
TIMESTAMP('2014-03-27')))
WHERE
age >= 35
これにより、テーブルがクエリされます。
docs には他にもいくつかのオプションがあります。ぜひチェックしてみてください。
これは、複数のテーブルの選択の例を示すスニペットです。
SELECT trafficSource.medium AS Traffic_Source, COUNT(trafficSource.medium) AS Counts_Source
FROM [608XXXXX.ga_sessions_20131008],
[608XXXXX.ga_sessions_20131009],
[608XXXXX.ga_sessions_20131010],
[608XXXXX.ga_sessions_20131011],
[608XXXXX.ga_sessions_20131012],
[608XXXXX.ga_sessions_20131013],
[608XXXXX.ga_sessions_20131014],
[608XXXXX.ga_sessions_20131015],
GROUP BY Traffic_Source
ORDER BY Counts_Source DESC
2017年の更新:
BigQuery #standardSQLを使用すると、標準のUNION ALL
を使用して複数のテーブルを調べるか、*
を使用して同じプレフィックスを共有するすべてのテーブルに一致させることができます。 *
マッチャーを使用すると、メタ列_TABLE_SUFFIX
にアクセスして、行がどのテーブルからのものであるかを知ることもできます。
SELECT * FROM Roster
UNION ALL
SELECT * FROM TeamMascot
ワイルドカードを使用します。
SELECT trafficSource.medium AS Traffic_Source, COUNT(trafficSource.medium) AS Counts_Source
FROM `608XXXXX.ga_sessions_201310*`
GROUP BY Traffic_Source
ORDER BY Counts_Source DESC