【问题标题】:BigQuery : filter repeated fields with standard SQLBigQuery:使用标准 SQL 过滤重复字段
【发布时间】:2016-12-06 16:52:42
【问题描述】:

我有下表:

row | query_params | query_values
1     foo            bar  
      param          val
2     foo            baz 

JSON:

{ 
"query_params" : [ "foo", "param"], 
"query_values" : [ "bar", "val" ] 
}, { 
"query_params" : [ "foo" ], 
"query_values" : [ "baz" ] 
}

使用标准 SQL,我想过滤重复字段的值,例如

SELECT * FROM table WHERE query_params = 'foo'

哪个会输出

row | query_params | query_values
1     foo            bar  
2     foo            baz       

PS : 对于使用旧版 SQL 的相同问题,请参阅 here

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    您是否在differences in filtering repeated fields 的迁移指南中看到了该主题?使用您的示例数据作为基础,并假设参数和值一起重复(而不是单独的数组),您可以编写如下查询:

    WITH T AS (
      SELECT 1 AS row, ARRAY<STRUCT<param STRING, value STRING>>[
          ('foo', 'bar'), ('param', 'val')] AS queries UNION ALL
      SELECT 2, ARRAY<STRUCT<param STRING, value STRING>>[('foo', 'baz')]
    )
    SELECT * EXCEPT (queries)
    FROM T, UNNEST(queries)
    WHERE param = 'foo';
    

    这里的重要部分是T 和UNNEST(queries) 之间的,,它取T 的行和queries 中的元素的叉积。这相当于也使用JOIN 或CROSS JOIN 代替逗号。

    查询还使用EXCEPT (queries) 来避免在查询结果中选择原始数组,因为我们只想要数组的“扁平化”内容。

    编辑:另一个示例查询,这次参数和值独立重复:

    WITH T AS (
      SELECT 1 AS row, ['foo', 'param'] AS query_params,
        ['bar', 'val'] AS query_values UNION ALL
      SELECT 2, ['foo'], ['baz']
    )
    SELECT row, query_param, query_values[OFFSET(o)] AS query_value
    FROM T, UNNEST(query_params) AS query_param WITH OFFSET o
    WHERE query_param = 'foo';
    

    这使用query_params 中的偏移量来并行索引query_values。

    【讨论】:

    • 你的模式是 "queries": [ { "param": "foo", "value": "bar" }, { "param": "param", "value": "val" } ],我的是 "query_params" : [ "foo", "param"], "query_values" : [ "bar", "val" ] 我没有看到您指出的文档,因为我不是从旧版迁移而是开始新鲜有标准,我去看看。
    • 我添加了另一个示例查询,其中两列独立重复。我不知道我们在现有文档中有任何这样的示例,但添加一个可能会很有用(我将跟进我们的文档编写者)。谢谢!
    • 哇,我不知道你可以像这样使用偏移量,太棒了!应该添加到 OFFSET 文档中。而且我还认为“从传统 SQL 迁移到标准 SQL”中的文档应该重命名或重新编写,因为它包含对未迁移的人有用的信息。
    • 好的,现在我需要使用旧版 SQL 做同样的事情,这是一场噩梦啊,在这里创建了另一个问题 stackoverflow.com/questions/41098239/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多