如何在 BigQuery 中使用空间连接进行外部连接,以便能够在没有交集的情况下获得 0 的计数值?
How to do an OUTER join with a spatial join in BigQuery to be able to get a count value of 0 where there is no intersection?
我正在做一个相当传统的 point/polygon 空间连接以确定落在每个多边形中的点数。结果(来自左侧连接)包括所有多边形 + 存在交叉点的计数。但它不会 return 没有交点的多边形 + 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 JOIN,这就是您收到此错误的原因。解决方法是对 OUTER table.
中的某个唯一 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
在左边是唯一的table,这个可以换成
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, ST_GEOGPOINT(b.longitude, 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, ST_GEOGPOINT(b.longitude, b.latitude))
GROUP BY
geo_id
) c
ON a.geo_id = c.geo_id
我正在做一个相当传统的 point/polygon 空间连接以确定落在每个多边形中的点数。结果(来自左侧连接)包括所有多边形 + 存在交叉点的计数。但它不会 return 没有交点的多边形 + 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 JOIN,这就是您收到此错误的原因。解决方法是对 OUTER table.
中的某个唯一 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
在左边是唯一的table,这个可以换成
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, ST_GEOGPOINT(b.longitude, 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, ST_GEOGPOINT(b.longitude, b.latitude))
GROUP BY
geo_id
) c
ON a.geo_id = c.geo_id