【问题标题】:BigQuery: NEST alternative in Standard SQLBigQuery:标准 SQL 中的 NEST 替代方案
【发布时间】:2018-10-28 22:13:03
【问题描述】:

标准 SQL 中 NEST 函数的替代方法是什么。我试过ARRAY_AGG 提到here 但ARRAY_AGG 返回一行,而NEST 返回扁平数组。

旧版 SQL:NEST

标准 SQL:ARRAY_AGG

【问题讨论】:

  • 我认为array_agg() 应该做你想做的事。我不确定您对nest() 的使用是否正确。它应该有一个group by
  • 仅供参考:group by 此处不需要 - 聚合函数 nest() 和 `array_agg()' 从该点(分组)来看将表现相同

标签: sql google-bigquery data-analysis


【解决方案1】:

以下是 BigQuery:

标准 SQL 中的 ARRAY_AGG()实际上等同于旧版 SQL 中的 NEST()
它们都返回一行中的元素数组

不同之处在于 UI 如何显示结果重复字段 - 对于旧版 SQL UI 将结果展平,这就是为什么您将其视为“展平数组”

你可以在下面运行测试一下

#legacySQL  
SELECT COUNT(1) rows FROM (
  SELECT NEST(x) y
  FROM (SELECT 1 AS x),
    (SELECT 2 AS x),
    (SELECT 3 AS x),
    (SELECT 4 AS x),
    (SELECT 5 AS x)
)

结果

Row rows     
1   1    

请记住 - UI 中的这种扁平化仅发生在大多数外部选择语句中,所有内部选择都将 NEST 视为数组/重复字段

将结果保存到表中 - 如果您想将下面的输出保留为重复字段

#legacySQL  
SELECT NEST(x) y
FROM (SELECT 1 AS x),
  (SELECT 2 AS x),
  (SELECT 3 AS x),
  (SELECT 4 AS x),
  (SELECT 5 AS x)

您需要确保您已禁用Flatten Results,您还需要Allow Large Results

【讨论】:

    【解决方案2】:

    我有点惊讶,但是这个查询:

    select *
    from (select 1 as x),
         (select 2 as x),
         (select 3 as x),
         (select 4 as x),
         (select 5 as x)
    

    返回与此查询完全相同的内容:

    select *
    from (select 1 as x),
         (select 2 as x),
         (select 3 as x),
         (select 4 as x),
         (select 5 as x);
    

    毫无疑问,问题在于缺少group by。所以,我认为一个简单的select * 会做你想做的事:

    select *
    from (select 1 as x union all select 2 union all select 3 union all select 4 union all select 5
         ) n
    

    【讨论】:

    • 差异是由于旧版 SQL 查询结果中重复字段的自动展平。您可以在经典 UI 中的选项下关闭此功能。
    • @ElliottBrossard。 . .谢谢你的解释。我从未广泛使用过旧版 SQL,鉴于文档,NEST() 的行为非常奇怪。
    猜你喜欢
    • 2011-03-13
    • 2016-02-29
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多