BigQuery 物化视图左连接

问题描述 投票:0回答:1

我知道当前的物化视图不支持 LEFT JOINS,所以我的问题是是否有办法获得相同的结果。 我有一个带有 GPS 坐标的表 (mytable1),我想与表 mytable3 中创建的某些区域(多边形)匹配。 mytable2只是添加个性化信息,对于问题本身并不重要。 我上面的代码...从 LEFT 更改为 INNER 在物化视图中有效,但我丢失了 mytable3 中区域之外的点。 有什么想法吗?

CREATE MATERIALIZED VIEW MY_TABLE
  PARTITION BY TIMESTAMP_TRUNC(date, DAY)
  CLUSTER BY node_address
  OPTIONS (enable_refresh = true)
AS (
  SELECT
    date,
    personName,
    personId,
    area,
  FROM
    MyTable1 AS Mytable1
  INNER JOIN
    MyTable2 AS Mytable2
  ON
    Mytable1.uuid = Mytable2.uuid
  LEFT JOIN
    Mytable2 AS Polygons
  ON
    ST_CONTAINS(Polygons.geoJSON, Mytable1.gps_coordinates)
  WHERE
    type = "person"
)

sql google-bigquery geolocation materialized-views
1个回答
0
投票

在这个问题上我想到了两种方法。当你有窗口函数或像你在MV中所说的连接时,你绝对必须使用MV而不能只使用普通视图,唯一的方法是将MV更改为非增量MV,并设置适当的max-陈旧等

https://cloud.google.com/bigquery/docs/materialized-views-create#non-incremental

  1. 另一种方法是以某种方式使用内连接而不屈服于左连接。你可以试试这个:
CREATE MATERIALIZED VIEW MY_TABLE
  PARTITION BY TIMESTAMP_TRUNC(date, DAY)
  CLUSTER BY node_address
  OPTIONS (enable_refresh = true)
AS (
  SELECT
    date,
    personName,
    personId,
    area
  FROM
    MyTable1 AS Mytable1
  INNER JOIN
    MyTable2 AS Mytable2
  ON
    Mytable1.uuid = Mytable2.uuid
  INNER JOIN
    Mytable3 AS Polygons
  ON
    ST_CONTAINS(Polygons.geoJSON, Mytable1.gps_coordinates)
  WHERE
    type = "person"
  
  UNION
  
  SELECT
    date,
    personName,
    personId,
    area
  FROM
    MyTable1 AS Mytable1
  INNER JOIN
    MyTable2 AS Mytable2
  ON
    Mytable1.uuid = Mytable2.uuid
  WHERE
    type = "person"
    AND NOT EXISTS (
      SELECT 1
      FROM Mytable3 AS Polygons
      WHERE ST_CONTAINS(Polygons.geoJSON, Mytable1.gps_coordinates)
    )
);

第一部分对多边形执行 INNER JOIN,并且仅包含定义区域内的点。第二部分使用 NOT EXISTS 子句检索不在任何区域内的点。

© www.soinside.com 2019 - 2024. All rights reserved.