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 表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Nodejs中使用Sequelize在没有公共列的两个表上进行INNER JOIN?
SQLServer中 join 跟inner join的区别是啥?
`pd.concat` 与 `join=='inner'` 不会产生 pandas 数据帧的交集