web-dev-qa-db-ja.com

BigQuery標準SQL:ARRAYフィールドでグループ化する方法

私のテーブルには、idaの2つの列があります。列idには数値が含まれ、列aには文字列の配列が含まれます。特定の配列の一意のIDの数を数えたいのですが、配列間の同等性は「同じサイズ、各インデックスの同じ文字列」として定義されています。

_GROUP BY a_を使用すると、_Grouping by expressions of type ARRAY is not allowed_が得られます。 GROUP BY ARRAY_TO_STRING(a, ",")のようなものを使用できますが、2つの配列_["a,b"]_と_["a","b"]_がグループ化され、配列の「実際の」値が失われます(したがって、後で別のクエリで使用します。文字列を分割する必要があります)。

このフィールド配列の値はユーザーからのものであるため、一部の文字が単にそこに存在することはないとは限りません(そしてそれを区切り文字として使用します)。

5
Ted

GROUP BY ARRAY_TO_STRING(a, ",")の代わりにGROUP BY TO_JSON_STRING(a)を使用してください

したがって、クエリは次のようになります

#standardsql
SELECT 
  TO_JSON_STRING(a) arr,
  COUNT(DISTINCT id) cnt
FROM `project.dataset.table`
GROUP BY arr

以下のようなダミーデータでテストできます

#standardsql
WITH `project.dataset.table` AS (
  SELECT 1 id, ["a,b", "c"] a UNION ALL
  SELECT 1, ["a","b,c"]
)
SELECT 
  TO_JSON_STRING(a) arr,
  COUNT(DISTINCT id) cnt
FROM `project.dataset.table`
GROUP BY arr  

結果として

Row     arr             cnt  
1       ["a,b","c"]     1    
2       ["a","b,c"]     1    

@Tedのコメントに基づいて更新

#standardsql
SELECT 
  ANY_VALUE(a) a,
  COUNT(DISTINCT id) cnt
FROM `project.dataset.table`
GROUP BY TO_JSON_STRING(a)
8