Google bigquery 内部连接两个基于公共时间戳的BigQuery表,在彼此的范围内?

Google bigquery 内部连接两个基于公共时间戳的BigQuery表,在彼此的范围内?,google-bigquery,Google Bigquery,我在BigQuery中有两个表。基本上,一个人有一堆基于时间戳的数据。第二组数据有另一个要添加到第一组的特性,也带有时间戳。但是,时间戳不一定相同。然而,我知道他们将在30秒内相距 我在想我可以加入。。。在absTimestamp1-Timestamp2

我在BigQuery中有两个表。基本上,一个人有一堆基于时间戳的数据。第二组数据有另一个要添加到第一组的特性,也带有时间戳。但是,时间戳不一定相同。然而,我知道他们将在30秒内相距


我在想我可以加入。。。在absTimestamp1-Timestamp2<30上,但这不起作用。

您可以进行交叉联接。这不是很有效,但如果表相对较小,它会起作用。语法也使用标准SQL,请参阅Mikhail的链接如何启用它:

select
  ts1, x, ts1, y
from MainTable
cross join SecondTable
where abs(ts1 - ts2) < 30
对于非常大的表,您可能需要做一些更详细的操作,比如按分钟对两侧进行存储,并进行相等连接。当JOIN交叉到相邻bucket时,您还需要支持case,例如:

SELECT
  ts1, x, ts2, y
FROM MainTable 
JOIN 
(SELECT *, round(ts2/30) as bucket FROM SecondTable 
   UNION ALL
 SELECT *, round(ts2/30-1) as bucket FROM SecondTable 
   UNION ALL
 SELECT *, round(ts2/30+1) as bucket FROM SecondTable)
ON round(ts1/30) = bucket
WHERE abs(ts1-ts2) < 30
如果有多个匹配项,您需要选择最佳匹配项,请执行以下操作

select * 
from (
   select *, MIN(ABS(ts1-ts2)) over(partition by ts1) as min_diff
   from ( <previous query> ))
where abs(ts1-ts2) = min_diff;

结果只是把时间戳四舍五入到最近的一分钟,因为这对于我来说已经足够好了,但是谢谢!嗨,迈克尔。谢谢你指出它的局限性,它可以处理内联数据,但不能处理表。在我的回答中,我删除了它,以免混淆其他用户。