はじめに


BigQueryのSTRINGを連結する際,調べるとサブクエリでやORDER BYやDISTINCTしてから連結する記事が見つかります.
しかし,サブクエリは他の人が見た時にとても分かりづらく,中々メンテナンスのコストがかかってしまいます.

そのため,サブクエリを使わないSTRINGを連結するやり方です.
といってもいくつかBigQueryのドキュメントを見れば分かることです.

BigQueryやSQLServerではSTRING_AGGを使えばかなり楽に書けますという話です.

使い所


以下のようなuser_idに対して,何のフルーツを食べたかというテーブルデータがあったとします.

WITH fruit_log AS (
  SELECT 'XXX' AS user_id, 'Apple' AS ate_fruit
  UNION ALL SELECT 'XXX', 'Banana'
  UNION ALL SELECT 'YYY', 'Orange'
  UNION ALL SELECT 'YYY', 'Apple'
  UNION ALL SELECT 'ZZZ', 'Orange'
  UNION ALL SELECT 'ZZZ', 'Orange'
)

SELECT * FROM fruit_log
基礎テーブル

このとき以下のようにuser_idごとに食べたフルーツを羅列したい場合があります.

集約済みテーブル

SQL


SELECT
  user_id,
  STRING_AGG(DISTINCT ate_fruit ORDER BY ate_fruit) AS ate_fruits
FROM
  fruit_log
GROUP BY
  user_id

終わりに


単発分析ならともかく,レポートなどで運用するクエリを書く場合は可読性を意識して書きましょう.

mysql使っていたので知らなかったのですが,STRING_AGGが強い.