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';
这里的重要部分是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 做同样的事情,这是一场噩梦啊,在这里创建了另一个问题 ***.com/questions/41098239/…以上是关于BigQuery:使用标准 SQL 过滤重复字段的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery:在标准 SQL 中使用重复/数组 STRUCT 字段加入?