我正在尝试根据另一个数据集中的条件过滤数据集。在代码中它是这样的(虽然这不起作用):
SELECT
location_integer
FROM
[datasetA]
WHERE
(SELECT COUNT(*) FROM datasetB
WHERE
datasetB.region_start < datasetA.location_integer
AND datasetA.location_integer < datasetB.region_end) > 1
单词:datasetA
有一列位置(整数),datasetB
有一列由region_start
和region_end
指定的区域。我想根据datasetA
中是否存在包含datasetA.location
的区域来过滤datasetB
。如果不存在这样的区域,我想过滤掉那一行。
同样的好处是创建一个中间表,其中包含datasetA
中包含每个位置的区域数量,然后对其进行过滤,但我还没有设法解决这个问题。
这些表是否必须包含在同一数据集中才能实现?
感谢您的帮助。
答案 0 :(得分:1)
几乎任何将BigQuery中两个表的数据组合在一起的答案都归结为联合或联接。联盟显然对您的用例没有帮助,因此您正在查看联接。
不幸的是,这是一个非常棘手的问题,因为BigQuery的连接条件只允许相等的连接(例如,a.f = b.f AND a.g = b.g
)。
如果您的表格不是太大,您可以CROSS JOIN它们,并过滤掉剩余的行。但是,随着您的表变大,该解决方案无法很好地扩展,因为生成的中间数据量非常大。
或者,如果您的区域包含少量离散值,则可以将datasetB
与整数表连接,以生成每个区域中包含的点列表,然后将该表与该位置连接表
SELECT location_integer
FROM datasetA
WHERE location_integer IN
(SELECT (datasetB.region_start + integers.n) AS region_point
FROM datasetB
CROSS JOIN integers
WHERE integers.n <= (datasetB.region_end - datasetA.region_start))
这种方法减少了CROSS JOIN的大小,假设您可以保证区域的最大大小很小。