我知道当前的物化视图不支持 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"
)
在这个问题上我想到了两种方法。当你有窗口函数或像你在MV中所说的连接时,你绝对必须使用MV而不能只使用普通视图,唯一的方法是将MV更改为非增量MV,并设置适当的max-陈旧等
https://cloud.google.com/bigquery/docs/materialized-views-create#non-incremental
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 子句检索不在任何区域内的点。