BigQuery:使用标准 SQL 过滤重复字段

Posted

技术标签:

【中文标题】BigQuery:使用标准 SQL 过滤重复字段【英文标题】:BigQuery : filter repeated fields with standard 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

【问题讨论】:

【参考方案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';

这里的重要部分是TUNNEST(queries) 之间的,,它取T 的行和queries 中的元素的叉积。这相当于也使用JOINCROSS 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 做同样的事情,这是一场噩梦啊,在这里创建了另一个问题 ***.com/questions/41098239/…

以上是关于BigQuery:使用标准 SQL 过滤重复字段的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:在标准 SQL 中使用重复/数组 STRUCT 字段加入?

在 BigQuery 中展平嵌套和重复的结构(标准 SQL)

BigQuery SQL:无法查询重复字段的叉积/

查询 Bigquery 重复字段

在新的 BigQuery 标准 SQL 的数组中使用结构

如何在 bigquery 标准 sql 中展平结构?