BigQuery SQLサンプル - 相関クロス結合
相関クロス結合とは
相関クロス結合の前にクロス結合(直積ともいいます)についてお復習いしておきましょう。
クロス結合(直積)
クロス結合は全ての組み合わせでテーブルを結合する方法です。
例えば、以下のような2つのテーブルをクロス結合した場合の結果はこうなります。
テーブルA
列A |
---|
1 |
2 |
3 |
テーブルB
列B |
---|
a |
b |
c |
クロス結合の結果
全ての組み合わせ結果となるので、3行×3行=9行の出力となります。
列A | 列B |
---|---|
1 | a |
1 | b |
1 | c |
2 | a |
2 | b |
2 | c |
3 | a |
3 | b |
3 | c |
相関クロス結合
クロス結合では全ての組み合わせが出力されますが、こんなことを考えたことはないでしょうか?
全ての組み合わせではなく、
・列Aの「1」という値に対しては列Bの「a」と「b」の組み合わせのみ表示したい
・列Aの「2」と「3」という値に対しては列Bの「b」と「c」の組み合わせのみ表示したい
つまり、こんな結果がほしい場合です。
列A | 列B |
---|---|
1 | a |
1 | b |
2 | b |
2 | c |
3 | b |
3 | c |
これを実現する方法として相関クロス結合を利用すると可能です。
相関クロス結合のSQLサンプル
では、実際に相関クロス結合のSQLを見てみましょう。
これまでの説明よりも少し複雑な例のサンプルを用意しました。
WITH wk AS
(
SELECT
['A', 'B'] AS kbn_1
, ['-'] AS kbn_2
, ['a', 'b', 'c'] AS kbn_3
UNION ALL
SELECT
['C'] AS kbn_1
, ['C-1','C-2'] AS kbn_2
, ['b', 'e'] AS kbn_3
)
SELECT
kbn_1
, kbn_2
, kbn_3
FROM
wk
CROSS JOIN UNNEST(wk.kbn_1) AS kbn_1
CROSS JOIN UNNEST(wk.kbn_2) AS kbn_2
CROSS JOIN UNNEST(wk.kbn_3) AS kbn_3
;
データの投入としてWITH句を用いていますが、実テーブルでも同じです。
このクエリでやりたいこと
kbn_1が「A」「B」の場合は、kbn_2が「-」固定でkbn_3が「a」「b」「c」の組み合わせがほしい
また、
kbn_2が「C」の場合は、kbn_2が「C-1」「C-2」とkbn_3が「b」「e」の組み合わせがほしい
という2パターンの組み合わせを同時に処理したいということです。
ポイント
配列形式のデータをUNNEST関数で行データに展開したものをFROM句にCROSS JOINで結合すると相関クロス結合となります。
実行結果
行 | kbn_1 | kbn_2 | kbn_3 |
---|---|---|---|
1 | A | - | a |
2 | A | - | b |
3 | A | - | c |
4 | B | - | a |
5 | B | - | b |
6 | B | - | c |
7 | C | C-1 | b |
8 | C | C-1 | e |
9 | C | C-2 | b |
10 | C | C-2 | e |
想定通りの結果を得ることができました。