web-dev-qa-db-ja.com

BigQueryで複数のテーブルをクエリする

BigQueryのテーブル内のデータを更新することはできず、追加メカニズムのみをサポートしているため、毎月新しいテーブルを作成することにしました。したがって、2012年のテーブルは(tbl_012012tbl_022012tbl_032012、...tbl_122012)。各レコードは、日付timestampとともに文字列として保存されます。

さて、私のアプリケーションが2012年1月からの範囲のレコードをフェッチしたい場合(tbl_012012)から2012年3月(tbl_032012)、BigQuery APIは単一のSQL範囲クエリを介して目的のテーブルを自動的にトラバースしますか、それとも各クエリ結果を取得してそれらをまとめるために追加のアプリケーションコードを使用して複数のSQLクエリを作成する必要がありますか?

14
Pratik Borkar

1つのSQLクエリで複数のテーブルを参照できます。 FROM句で各テーブルをコンマで区切るだけで、言及されているすべてのテーブルをクエリできます。

14
Ryan Boyd

テーブルワイルドカード関数を使用することもできます。 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

これにより、テーブルがクエリされます。

  • mydata.people20140325
  • mydata.people20140326
  • mydata.people20140327

docs には他にもいくつかのオプションがあります。ぜひチェックしてみてください。

34
Eduardo

これは、複数のテーブルの選択の例を示すスニペットです。

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
5
Nathaniel Payne

2017年の更新:

BigQuery #standardSQLを使用すると、標準のUNION ALLを使用して複数のテーブルを調べるか、*を使用して同じプレフィックスを共有するすべてのテーブルに一致させることができます。 *マッチャーを使用すると、メタ列_TABLE_SUFFIXにアクセスして、行がどのテーブルからのものであるかを知ることもできます。

SELECT * FROM Roster
UNION ALL
SELECT * FROM TeamMascot
2
Felipe Hoffa

標準SQL。

ワイルドカードを使用します。

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
1
Charles Kangai