INNER JOIN 基于彼此范围内的公共时间戳的两个 BigQuery 表?

Posted

技术标签:

【中文标题】INNER JOIN 基于彼此范围内的公共时间戳的两个 BigQuery 表?【英文标题】:INNER JOIN two BigQuery tables based on common timestamps within a range of each other? 【发布时间】:2016-09-12 22:14:28 【问题描述】:

我在 BigQuery 中有两个表。基本上一个人有一堆基于时间戳的数据。第二组数据具有添加到第一组的另一个功能,也带有时间戳。但是,时间戳不一定相同。不过,我确实知道它们会在 30 秒之内出现。

我在想我可以 JOIN... ON abs(Timestamp1 - Timestamp2)

【问题讨论】:

【参考方案1】:

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

select
  ts1, x, ts1, y
from MainTable
cross join SecondTable
where abs(ts1 - ts2) < 30

对于非常大的表,您可能需要做一些更精细的操作,比如按分钟存储两边,然后执行相等 JOIN。当 JOIN 跨越到邻居存储桶时,您还需要支持 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;

【讨论】:

最后只是将时间戳四舍五入到最接近的分钟,因为这对我的目的来说已经足够了,但是谢谢! 嗨@Michael。感谢您在我的回答中指出限制(它适用于内联数据但不适用于表格)(我将其删除以免混淆其他用户)。

以上是关于INNER JOIN 基于彼此范围内的公共时间戳的两个 BigQuery 表?的主要内容,如果未能解决你的问题,请参考以下文章

inner_join(),其中一个键的值范围(年份)

如何在Nodejs中使用Sequelize在没有公共列的两个表上进行INNER JOIN?

SQLServer中 join 跟inner join的区别是啥?

`pd.concat` 与 `join=='inner'` 不会产生 pandas 数据帧的交集

范围 COUNT 查询基于 Hibernate 中纪元时间戳的 DATE

Oracle SQL INNER Join 基于不匹配的值