11

我的表有两列,id并且a. 列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"]组合在一起,并且我丢失了数组的“真实”值(因此,如果稍后我想在另一个查询中使用它,我必须拆分字符串)。

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

4

2 回答 2

17

而不是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)
于 2018-02-23T00:58:34.563 回答
0

或者,您可以使用逗号以外的其他分隔符

ARRAY_TO_STRING(a,"|")
于 2021-08-18T09:22:29.943 回答