【问题标题】:Transpose arrays in BigQuery在 BigQuery 中转置数组
【发布时间】:2017-12-06 11:51:28
【问题描述】:

在 BigQuery 中,我如何转置这些记录:

 fruit  | color  |  aA        |  aB        |  aC
--------+--------+------------+------------+------------
 apple  | green  | [10,11]    | [12,13]    | [14,15]
 orange | orange | [20,21,22] | [23,24,25] | [26,27,28]

到:

 fruit  | color  | A  | B  | C
--------+--------+----+----+----
 apple  | green  | 10 | 12 | 14
 apple  | green  | 11 | 13 | 15
 orange | orange | 20 | 23 | 26
 orange | orange | 21 | 24 | 27
 orange | orange | 22 | 25 | 28

在 PrestoDB/Athena 或 PostgreSQL 中,我会使用带有多个参数的 UNNEST,但 BigQuery 不支持它。

CROSS JOIN UNNEST(aA, aB, aC) AS t(A, B, C)

注意:

  • 一行中的所有数组都具有相同的长度;
  • 不同记录的数组长度可能不同。

便签本:

#standardSQL

WITH arrays AS (
  SELECT 'apple' AS fruit, 'green' AS color, [10,11] AS aA, [12,13] AS aB, [14,15] AS aC UNION ALL
  SELECT 'orange' AS fruit, 'orange' AS color, [20,21,22] AS aA, [23,24,25] AS aB, [26,27,28] AS aC

)
SELECT * FROM arrays

提前致谢。

【问题讨论】:

    标签: arrays google-bigquery transpose


    【解决方案1】:

    您可以在第一个数组上使用 WITH OFFSET,然后在另外两个上使用括号运算符:

    #standardSQL
    WITH arrays AS (
      SELECT 'apple' AS fruit, 'green' AS color, [10,11] AS aA, [12,13] AS aB, [14,15] AS aC UNION ALL
      SELECT 'orange' AS fruit, 'orange' AS color, [20,21,22] AS aA, [23,24,25] AS aB, [26,27,28] AS aC
    )
    SELECT * EXCEPT(aA, aB, aC),
      aB[OFFSET(off)] AS B, aC[OFFSET(off)] AS C
    FROM arrays
    CROSS JOIN UNNEST(aA) AS A WITH OFFSET off;
    

    我已将反馈传递给我们的技术作者,以使此语法更易于查找并提供示例。

    【讨论】:

    • 谢谢!完成查询需要一个小修复:SELECT * EXCEPT(aA, aB, aC, A)。我完全忽略了UNNEST 文档中的WITH OFFSET 子句。我认为这个用例非常适合Working with arrays
    • 是的,当然。一旦我们更新了文档,我会在这里尝试跟进。谢谢!
    猜你喜欢
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多