如何在 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