【问题标题】:BigQuery standard SQL: how to group by an ARRAY fieldBigQuery 标准 SQL:如何按 ARRAY 字段分组
【发布时间】:2018-08-03 00:15:58
【问题描述】:

我的表格有两列,idaid 列包含一个数字,a 列包含一个字符串数组。我想计算给定数组的唯一 id 的数量,数组之间的相等性被定义为“相同大小,每个索引的相同字符串”。

当使用GROUP BY a 时,我得到Grouping by expressions of type ARRAY is not allowed。我可以使用 GROUP BY ARRAY_TO_STRING(a, ",") 之类的东西,但随后将两个数组 ["a,b"]["a","b"] 组合在一起,我丢失了数组的“真实”值(所以如果我想稍后在另一个查询中使用它,我必须拆分字符串)。

此字段数组中的值来自用户,因此我不能假设某些字符根本不会出现(并将其用作分隔符)。

【问题讨论】:

    标签: arrays string group-by google-bigquery sql-standards


    【解决方案1】:

    GROUP BY TO_JSON_STRING(a)代替GROUP BY ARRAY_TO_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)
    

    【讨论】:

    • 太棒了。喜欢这个解决方案多么简单。附加说明:要保留数组(并在以后重复使用),您可以将ANY_VALUE(a) a 添加到最终选择中(因为它们都相同,所以选择哪一个并不重要)。
    【解决方案2】:

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

    ARRAY_TO_STRING(a,"|")
    

    【讨论】:

    • 嗨,欢迎来到 Stack Overflow!这个建议将像 ["a", "b"] 和 ["a|b"] 这样的数组组合在一起,所以这不起作用。这就是TO_JSON_STRING 解决方案聪明的原因:它会自动转义正确的内容。
    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多