BigQuery标准SQL:如何按ARRAY字段分组

Ted*_*Ted 3 arrays string group-by sql-standards google-bigquery

我的表有两列,ida.列id包含一个数字,列a包含一个字符串数组.我想计算给定数组的唯一ID数,数组之间的相等性定义为"相同大小,每个索引的字符串相同".

使用时GROUP BY a,我明白了Grouping by expressions of type ARRAY is not allowed.我可以使用类似的GROUP BY ARRAY_TO_STRING(a, ","),但随后的两个数组["a,b"],并["a","b"]组合在一起,和我失去了我的数组的"真实"价值(所以如果我想在另一个查询后使用它,我必须分割字符串).

此字段数组中的值来自用户,因此我不能假设某些字符永远不会存在(并将其用作分隔符).

Mik*_*ant 7

而不是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
Run Code Online (Sandbox Code Playgroud)

您可以使用如下的虚拟数据进行测试

#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  
Run Code Online (Sandbox Code Playgroud)

结果为

Row     arr             cnt  
1       ["a,b","c"]     1    
2       ["a","b,c"]     1    
Run Code Online (Sandbox Code Playgroud)

根据@Ted的评论更新

#standardsql
SELECT 
  ANY_VALUE(a) a,
  COUNT(DISTINCT id) cnt
FROM `project.dataset.table`
GROUP BY TO_JSON_STRING(a)
Run Code Online (Sandbox Code Playgroud)

  • 辉煌。爱这个解决方案多么简单。补充说明:要保留数组(并在以后重用),可以在最终选择中添加“ ANY_VALUE(a)a”(因为它们都相同,所以选择哪个都没关系)。 (2认同)