

データの分析や処理に便利なBigQuery(BQ)。
大規模データの処理に優れており、テーブルに保存した大きなデータでも短時間で集計することができる。
そして容量単価に優れているので、データを大量に作っても懐が痛まないのも特徴だ。

そんなBQを使う際に、テーブルのデータ比較をしたい場合がある。
例えば、とある処理を変更したときに変更前後で出力データのうちどのレコードが変わったか差分をとって確認するだろう。
しかしBigQueryで2つのテーブルの差分をどうやってとればいいのか。
そこで今回はBigQueryで2つのテーブルのMINUS差分をとる方法について紹介する。
この記事を書いている人

記事を読むメリット
BigQueryで2つのテーブルのMINUS差分をとる方法がわかり、データ処理で躓かなくなる
データ準備

まずはデータを準備する。
今回は2つのテーブルの差分を撮るので、2つデータを用意する。
ひとつはテーブル名 minus_sample01 として以下のCSVをインポート。
col1,col2,col3 a,b,c aa,bb,cc aaa,bbb,ccc aaaa,bbbb,cccc
もうひとつは minus_sample02 として以下のCSVをインポートする。
col1,col2,col3 a,b,c aa,bb,cc2 aaa2,bbb,ccc aaaa,bbbb,cccc
差分なのでMINUSを試してみる。

ではこの2つのテーブルの差分をとるにはどうしたらいいのか。

minus が使えるんだけど・・・実際に試してみる。
SELECT * FROM test.minus_sample01 MINUS SELECT * FROM test.minus_sample02
結果は以下の通り。
Syntax error: Expected end of input but got keyword SELECT at [3:1]
Syntax error、つまりSQLの構文エラーとなる。

MINUS は使えませんねBigQueryで2つのテーブルのMINUS差分をとる方法

BigQueryで2つのテーブルのMINUS差分をとるには集合演算子の EXCEPT DISTINCT を用いる。
使い方は MINUS と同じ。
SELECT * FROM test.minus_sample01 EXCEPT DISTINCT SELECT * FROM test.minus_sample02
結果は以下のようになる。
| Row | col1 | col2 | col3 |
| 1 | aa | bb | cc |
| 2 | aaa | bbb | ccc |
minus_sample01 にあって minus_sample02 に無い行だけ抽出することができた。
逆に minus_sample02 だけにある行を抽出したければ前後を入れ替えれば良い。
SELECT * FROM test.minus_sample02 EXCEPT DISTINCT SELECT * FROM test.minus_sample01
結果はこの通り。
| Row | col1 | col2 | col3 |
| 1 | aa | bb | cc2 |
| 2 | aaa2 | bbb | ccc |
2つめのテーブルにしか無い行が抽出できた。
まとめ

今回はBigQueryで2つのテーブルのMINUS差分をとる方法について解説した。
BigQueryで2つのテーブルの差分(差集合)をとる方法は以下の通り。
ココがポイント
集合演算子の EXCEPT DISTINCT を用いる。

UNION ALL と同じようなものですね他にもBigQueryに関する記事もあるので、興味があれば見てみて欲しい。



