如何使用间隔交叉加入 Big Query?

Posted

技术标签:

【中文标题】如何使用间隔交叉加入 Big Query?【英文标题】:How to cross join in Big Query using intervals? 【发布时间】:2013-12-06 20:50:57 【问题描述】:

如何在 Google Big Query 中使用区间连接两个表?

我有两张桌子:

Table CarsGPS:
ID | Car | Latitude | Longitude
1  | 1   | -22.123  | -43.123
2  | 1   | -22.234  | -43.234
3  | 2   | -22.567  | -43.567
4  | 2   | -22.678  | -43.678
...

Table Areas:
ID | LatitudeMin | LatitudeMax | LongitudeMin | LongitudeMax
1  | -22.124     | -22.120     | -43.124      | -43.120
2  | -22.128     | -22.124     | -43.128      | -43.124
...

我想交叉加入这些表,以使用 Google Big Query 检查每辆车经过的区域。

在一个普通的 SQL 服务器中,我会做:

SELECT A.ID, C.Car 
FROM Cars C, Areas A
WHERE C.Latitude BETWEEN A.LatitudeMin AND A.LatitudeMax AND
      C.Longitude BETWEEN A.LongitudeMin AND A.LongitudeMax

但 Google Big Query 只允许我使用连接表之间的完全匹配进行连接(甚至 JOIN EACH)。而“FROM X, Y”表示 UNION,而不是 JOINS。

所以,这不是一个选择:

SELECT A.ID, C.Car 
FROM Cars C
JOIN EACH
  Areas A
  ON C.Latitude BETWEEN A.LatitudeMin AND A.LatitudeMax AND
     C.Longitude BETWEEN A.LongitudeMin AND A.LongitudeMax

那么,我怎样才能运行类似的东西来识别每个区域内经过的汽车?

非常感谢,

【问题讨论】:

【参考方案1】:

BigQuery 现在支持 CROSS JOIN。您的查询如下所示:

SELECT A.ID, C.Car 
FROM Cars C 
CROSS JOIN Areas A
WHERE C.Latitude BETWEEN A.LatitudeMin AND A.LatitudeMax AND
  C.Longitude BETWEEN A.LongitudeMin AND A.LongitudeMax

【讨论】:

乔丹,预计何时发布此版本有什么消息吗? 语法有什么独特之处吗?我仍然收到“错误:ON 子句必须是 AND of = 每个表中一个字段名的比较,所有字段名都以表名为前缀” 使用 CROSS JOIN 时不要使用 ON -- 只需使用 WHERE 限制。 @JordanTigani BigQuery 现在支持 CROSS JOIN 真是太好了!只是想提一下,它还没有在语法文档中:developers.google.com/bigquery/query-reference#joins 谢谢,我们将很快更新文档以添加一些新的查询语法特性和功能,这些特性和功能目前尚未记录。

以上是关于如何使用间隔交叉加入 Big Query?的主要内容,如果未能解决你的问题,请参考以下文章

如何在每次上传桶时更新Big Query后端数据

如何在 R 中有效地使用 big.matrix 进行交叉验证?

如何使用 POST 请求在 Big Query 中加载数据?

如何设置 Big Query 表的过期时间?

使用 Big Query,我如何在一条记录中查询多个对象?

如何在 Google Big Query 中正确使用 GROUP BY 命令?