私のテーブルには、id
とa
の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"]
_がグループ化され、配列の「実際の」値が失われます(したがって、後で別のクエリで使用します。文字列を分割する必要があります)。
このフィールド配列の値はユーザーからのものであるため、一部の文字が単にそこに存在することはないとは限りません(そしてそれを区切り文字として使用します)。
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)