如何在 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,因为你不能按地理分组。

enter image description here

解决方法

是的,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