【问题标题】:BigQuery: flatten the tableBigQuery:展平表格
【发布时间】:2018-01-15 22:12:54
【问题描述】:

有什么方法可以简单地展平下表,以便我可以将 (num*num_2) 乘以 mul,然后我可以通过 id 对组求和。 所以我真的在寻找类似于下面显示的第二张图片的表格。

PS:如果我取消嵌套,那么结果如下所示,这对我想要实现的目标没有帮助

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    以下几个选项(BigQuery 标准 SQL)

    #standardSQL
    WITH `yourproject.yourdataset.yourtable` AS (
      SELECT 1 id, [STRUCT<num INT64, num_2 INT64>(2013, 2013),(1625, 1625),(1297, 1297),(7634, 7634)] nums UNION ALL
      SELECT 2, [STRUCT<num INT64, num_2 INT64>(1,1),(2,2),(3,3),(4,4),(5,5)]
    )
    SELECT id, (SELECT SUM(num * num_2) FROM UNNEST(nums) nums ) as mul
    FROM `yourproject.yourdataset.yourtable`   
    

    #standardSQL
    WITH `yourproject.yourdataset.yourtable` AS (
      SELECT 1 id, [STRUCT<num INT64, num_2 INT64>(2013, 2013),(1625, 1625),(1297, 1297),(7634, 7634)] nums UNION ALL
      SELECT 2, [STRUCT<num INT64, num_2 INT64>(1,1),(2,2),(3,3),(4,4),(5,5)]
    )
    SELECT id, SUM(num * num_2) AS mul
    FROM `yourproject.yourdataset.yourtable`, UNNEST(nums) nums
    GROUP BY id   
    

    两者都返回下方

    id  mul  
    1   66652959     
    2   55   
    

    如果您不需要做 SUM(num * num_2) 而只是将表格展平 - 您可以使用下面的示例

    #standardSQL
    WITH `yourproject.yourdataset.yourtable` AS (
      SELECT 1 id, [STRUCT<num INT64, num_2 INT64>(2013, 2013),(1625, 1625),(1297, 1297),(7634, 7634)] nums UNION ALL
      SELECT 2, [STRUCT<num INT64, num_2 INT64>(1,1),(2,2),(3,3),(4,4),(5,5)]
    )
    SELECT id, num, num_2
    FROM `yourproject.yourdataset.yourtable`, UNNEST(nums) nums  
    

    【讨论】:

    • 你太棒了。这个例子很好用。我只需要应用到真实数据。希望它也能在那里工作。非常感谢您的快速回复
    • 这是您提供给其他人的示例之一 WITH yourTable AS ( SELECT 1 AS id, '2013,1625,1297,7634' AS string_col UNION ALL SELECT 2, '1,2,3 ,4,5' ) SELECT id, (SELECT ARRAY_AGG(CAST(num AS INT64)) FROM UNNEST(SPLIT(string_col)) AS num ) AS num, ARRAY(SELECT CAST(num AS INT64) FROM UNNEST(SPLIT(string_col) ) AS num ) AS num_2 FROM yourTable' 我怎样才能把它变成 struct 格式,以便我可以轻松地复制你刚才建议的多个
    • 我想,我回答了你原来的问题。如果您有更多问题 - 请将新问题作为新问题发布,我将非常乐意回答。也请考虑投票给对您有帮助的答案:o) 从而激励我们回答您的下一个问题
    • 无论如何 - 真的很难回答 cmets 中提出的问题 - 所以在 SO 上发布一个新问题是一个很好的做法
    • 非常感谢,我会发布一个新的并提供帮助。我的新问题只是想将数组转换为结构格式,以便我可以按照您的建议进行乘法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2012-02-26
    • 2014-11-20
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    相关资源
    最近更新 更多