BigQuery 标准 SQL:如何按 ARRAY 字段分组
BigQuery standard SQL: how to group by an ARRAY field
我的 table 有两列,id
和 a
。 id
列包含一个数字,a
列包含一个字符串数组。我想计算给定数组的唯一 ID 的数量,数组之间的相等性被定义为 "same size, same string for each index".
当使用 GROUP BY a
时,我得到 Grouping by expressions of type ARRAY is not allowed
。我可以使用 GROUP BY ARRAY_TO_STRING(a, ",")
之类的东西,但是这两个数组 ["a,b"]
和 ["a","b"]
被组合在一起,我失去了数组的 "real" 值(所以如果我想稍后在另一个查询中使用它,我必须拆分字符串)。
此字段数组中的值来自用户,因此我不能假设某些字符永远不会存在(并将其用作分隔符)。
而不是 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)
或者,您可以使用逗号以外的其他分隔符
ARRAY_TO_STRING(a,"|")
我的 table 有两列,id
和 a
。 id
列包含一个数字,a
列包含一个字符串数组。我想计算给定数组的唯一 ID 的数量,数组之间的相等性被定义为 "same size, same string for each index".
当使用 GROUP BY a
时,我得到 Grouping by expressions of type ARRAY is not allowed
。我可以使用 GROUP BY ARRAY_TO_STRING(a, ",")
之类的东西,但是这两个数组 ["a,b"]
和 ["a","b"]
被组合在一起,我失去了数组的 "real" 值(所以如果我想稍后在另一个查询中使用它,我必须拆分字符串)。
此字段数组中的值来自用户,因此我不能假设某些字符永远不会存在(并将其用作分隔符)。
而不是 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)
或者,您可以使用逗号以外的其他分隔符
ARRAY_TO_STRING(a,"|")