我需要以下帮助...
我创建了一个查询,该查询应基于两个坐标之间的特定距离来连接来自另一个表的记录。我最后得到一个表,该表仅包含具有匹配位置名称的记录(例如内部联接)。我需要table_customer_x中的每条记录,并且如果该客户的任何位置之间的距离> 250,则locationname应该为null。
我创建的查询:
SELECT t.customerid, t.geolatitude, t.geolongitude, tt.locationname
FROM `table_customer_x` t
LEFT JOIN `table_location` tt
on ST_DWITHIN(ST_GEOGPOINT(t.geoLatitude,t.geoLongitude), ST_GEOGPOINT(tt.latitude, tt.longitude), 250)
where tt.customer_id= 204
and t.timestamp > "2016-01-01"
and tt.latitude <= 90 and tt.latitude >= -90
table_customer_x看起来像:
timestamp geoLatitude geoLongitude
2018-01-01 00:00:00 52.000 4.000
table_location看起来像:
latitude longitude name customer_id
52.010 4.010 hospital x 204
答案 0 :(得分:2)
[为什么]基于st_dwithin条件的BigQuery左联接的行为类似于内部联接
在BigQuery中,使用以下标准SQL谓词功能为INNER JOIN和CROSS JOIN运算符实现了空间联接:
ST_DWithin
ST_Intersects
ST_Contains
ST_Within
ST_Covers
ST_CoveredBy
ST_Equals
ST_Touches
因此,您不能指望LEFT JOIN在您的情况下能正常工作-相反,您的左JOIN已被“转换”为CROSS JOIN,而ON子句中的过滤器已移到Where子句中。
所以您看到的结果是预期的
摘要-您只需要重写查询:o)
您可以尝试以下解决方法(未测试-只是您可能的选择)
#standardSQL
SELECT tt.customer_id, t.geolatitude, t.geolongitude, tt.name
FROM `project.dataset.table_customer_x` t
JOIN `project.dataset.table_location` tt
ON ST_DWITHIN(ST_GEOGPOINT(t.geoLatitude,t.geoLongitude), ST_GEOGPOINT(tt.latitude, tt.longitude), 250)
UNION ALL
SELECT tt.customer_id, t.geolatitude, t.geolongitude, tt.name
FROM `project.dataset.table_customer_x` t
JOIN `project.dataset.table_location` tt
ON NOT ST_DWITHIN(ST_GEOGPOINT(t.geoLatitude,t.geoLongitude), ST_GEOGPOINT(tt.latitude, tt.longitude), 250)
WHERE tt.customer_id= 204
AND t.timestamp > "2016-01-01"
AND tt.latitude <= 90 AND tt.latitude >= -90
答案 1 :(得分:1)
这可能是BigQuery的错误,现在似乎已修复。
地理空间外部联接尚未实现,因此此查询应失败,并显示消息LEFT OUTER JOIN cannot be used without a condition that is an equality of fields from both sides of the join.
解决方法是使用内部联接模拟外部联接:执行内部联接,然后与左侧不匹配的行合并。它需要在外面有一些唯一的键才能正常工作,我不确定table_customer_x中是否有一个。