created: 2022-10-09T05:03:28.210Z

BigQueryで配列(ARRAY)を集合(SET)みたいに使う関数

2つの配列について共通要素と差分の要素を出してくれる関数が欲しかったのだが、bigquery-utils にもなかったので用意した。

BigQueryのはあくまで配列(ARRAY)であり集合(SET)ではないので、積集合/差集合みたいな操作をしようとすると、結果が自明にならないから実装されてないとかなんだろうか。

共通する要素

積集合のような関数。

CREATE TEMP FUNCTION comm(arr_a ARRAY<INT64>, arr_b ARRAY<INT64>) RETURNS ARRAY<INT64> AS (
  (SELECT ARRAY_AGG(a) FROM UNNEST(arr_a) a JOIN UNNEST(arr_b) b WHERE a = b)
);

片方にのみある要素

差集合のような関数。

最初に渡した配列を基準としてそちらにのみある要素だけに絞って結果を返す。

CREATE TEMP FUNCTION only_l(arr_a ARRAY<INT64>, arr_b ARRAY<INT64>) RETURNS ARRAY<INT64> AS (
  (SELECT ARRAY_AGG(a) FROM UNNEST(arr_a) a WHERE a NOT IN UNNEST(arr_b))
);

ちなみに

和集合的な処理は組み込みで ARRAY_CONCAT というものが存在する。

知ってるつもり 無知の科学 (ハヤカワ文庫NF)
[ad] 知ってるつもり 無知の科学 (ハヤカワ文庫NF)
スティーブン スローマン, フィリップ ファーンバック (Kindle版)