如何解决如何在 BigQuery 中使用空间连接进行 OUTER 连接,以便在没有交集的情况下获得 0 的计数值?
我正在做一个相当传统的点/多边形空间连接,以确定落在每个多边形中的点数。结果(来自左连接)包括所有多边形 + 存在交集的计数。但它不会在没有交集的地方返回多边形 + 0 或 null。我希望仍然保留多边形几何图形,因为它在地图上看起来更好(而不是只是一个缺失区域)。
WITH
geoidandcount AS(
SELECT
a.geo_id,COUNT(b.latitude) AS count
FROM
`polygon_dataset` a
LEFT OUTER JOIN -- ERROR
`point_dataset` b
ON
st_contains(a.the_geom,ST_GEOGPOINT(b.longitude,b.latitude))
GROUP BY
a.geo_id )
SELECT
a.*,b.the_geom,a.count,FROM
geoidandcount a
JOIN
`polygon_dataset` b
USING
(geo_id)
我不得不做 CTE,因为你不能按地理分组。
解决方法
是的,BigQuery 尚无法优化地理空间外部联接,这就是您收到此错误的原因。解决方法是对 OUTER 表中的某个唯一 ID 执行地理空间 INNER JOIN,然后执行 OUTER JOIN。
为了演示更简单的例子,让我们以查询的这一部分为例:
SELECT
a.geo_id,b.latitude
FROM
`polygon_dataset` a
LEFT OUTER JOIN -- ERROR
`point_dataset` b
ON
st_contains(a.the_geom,ST_GEOGPOINT(b.longitude,b.latitude))
假设 geo_id
在左表中是唯一的,这可以替换为
SELECT
a.geo_id,c.latitude
FROM
`polygon_dataset` a
LEFT OUTER JOIN
(
SELECT
a.geo_id
b.latitude
FROM
`polygon_dataset` a
JOIN
`point_dataset` b
ON
st_contains(a.the_geom,b.latitude))
) c
ON a.geo_id = c.geo_id
这里,当右边没有匹配项时,计数将为 NULL,所以让我们使用 COALESCE(count,0)
得到 0。
完整的查询类似于
SELECT
a.geo_id,a.the_geom,COALESCE(c.count,0) AS count
FROM
`polygon_dataset` a
LEFT OUTER JOIN
(
SELECT
a.geo_id
COUNT(b.latitude) as count
FROM
`polygon_dataset` a
JOIN
`point_dataset` b
ON
st_contains(a.the_geom,b.latitude))
GROUP BY
geo_id
) c
ON a.geo_id = c.geo_id
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。