Google bigquery Bigquery-使用半联接对重复字段进行筛选

Google bigquery Bigquery-使用半联接对重复字段进行筛选,google-bigquery,Google Bigquery,我试图根据重复字段中的项是否位于另一个表的列中,从一个表中选择记录。当我在代码中显式列出我要测试的项目时,我能够做到这一点,但当从另一个表中选择时,我不能做到这一点。让我演示如何使用trigrams数据集: 比如说,我想选择在特定年份出现的所有记录。但我不仅仅需要这些年的数据——我需要所有与这些记录相关的数据。如果我只需要几年的数据,我可以做这样的事情(这是可行的): 但是,我没有将“1800”和“1801”编码到我的查询中,而是有一个表years,其中包含一组我感兴趣的年份。我希望这能起作用:

我试图根据重复字段中的项是否位于另一个表的列中,从一个表中选择记录。当我在代码中显式列出我要测试的项目时,我能够做到这一点,但当从另一个表中选择时,我不能做到这一点。让我演示如何使用trigrams数据集:

比如说,我想选择在特定年份出现的所有记录。但我不仅仅需要这些年的数据——我需要所有与这些记录相关的数据。如果我只需要几年的数据,我可以做这样的事情(这是可行的):

但是,我没有将“1800”和“1801”编码到我的查询中,而是有一个表
years
,其中包含一组我感兴趣的年份。我希望这能起作用:

SELECT ngram, first, second, third, fourth, fifth, cell.value, cell.volume_count,
    SOME(cell.value in (SELECT year_as_str FROM [mydataset.years])) WITHIN RECORD AS valid
FROM [publicdata:samples.trigrams]
HAVING valid
这不起作用,因为bigquery要求半联接是
WHERE
HAVING
子句的一部分

因此,我尝试重新安排(回到第一个查询):

这导致在“”中的“”内遇到错误
。。。他期待着

因此,现在没有记录中的

SELECT ngram, first, second, third, fourth, fifth, cell.value, cell.volume_count
FROM [publicdata:samples.trigrams]
HAVING SOME(cell.value in ('1801', '1802'))
这导致错误
SELECT子句混合了聚合“…”和字段“…”,而没有GROUP BY子句

但我没有聚合!现在我将过滤器移动到
中,其中

SELECT ngram, first, second, third, fourth, fifth, cell.value, cell.volume_count
FROM [publicdata:samples.trigrams]
WHERE SOME(cell.value in ('1801', '1802'))
这告诉我,
无效的函数名:SOME
。什么


有没有一种方法可以让我在BigQuery中找到我想要的行为?

下面解决了您的示例,我希望您能够将其扩展到实际用例中(如果您喜欢此解决方案)

请注意,在
[publicdata:samples.trigrams]
中,字段
单元格.value
重复字符串
-这就是为什么您会看到“extra”展平对象

您可以使用此子句。这可能需要双重否定,因为您需要忽略满足某些条件的记录。以下查询应该可以工作:

SELECT ngram, first, second, third, fourth, fifth, cell.value, cell.volume_count
FROM [publicdata:samples.trigrams]
OMIT RECORD IF EVERY(cell.value NOT IN ('1801', '1802'))

不幸的是,这不起作用,因为如果我用一个子选择查询替换
('1801','1802')
,整个查询就会失败。Mikhail的过滤器+自连接解决方案很好,抱歉!我本来没注意到你问题的那一部分。
SELECT ngram, first, second, third, fourth, fifth, cell.value, cell.volume_count
FROM [publicdata:samples.trigrams]
WHERE SOME(cell.value in ('1801', '1802'))
SELECT 
    ngram, cell.value, cell.volume_count, 
    cell.volume_fraction, cell.page_count, cell.match_count
FROM [publicdata:samples.trigrams] AS trigrams
JOIN (
  SELECT ngram AS qualified
  FROM (
    FLATTEN((SELECT ngram, cell.value AS value
      FROM (FLATTEN([publicdata:samples.trigrams], cell.value))), value)
  ) AS t
  JOIN [mydataset.years] AS y
  ON y.year_as_str = t.value
  GROUP BY 1
) AS valid
ON valid.qualified = trigrams.ngram
SELECT ngram, first, second, third, fourth, fifth, cell.value, cell.volume_count
FROM [publicdata:samples.trigrams]
OMIT RECORD IF EVERY(cell.value NOT IN ('1801', '1802'))