我在BigQuery中有两个表。基本上,有一堆基于时间戳的数据。第二组数据还有另一个要添加到第一组的功能,还有一个时间戳。但是,时间戳不一定相同。但是,我确实知道他们会在30秒之内相互接触。
我以为我可以做JOIN ... ON abs(Timestamp1 - Timestamp2)< 30,但那不起作用。
答案 0 :(得分:3)
你可以做CROSS JOIN。效率不高,但如果表格相对较小则可以使用。语法(也使用标准SQL,请参阅Mikhail的链接如何启用它):
select
ts1, x, ts1, y
from MainTable
cross join SecondTable
where abs(ts1 - ts2) < 30
对于非常大的表,您可能需要做一些更精细的事情,比如两分钟一分钟的桶,并做一个相等的JOIN。当JOIN跨越到邻居桶时,您还需要支持大小写,例如:
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;