[Почему] левое соединение BigQuery на основе условия st_dwithin, действующего как внутреннее соединение
В BigQuery Spatial JOIN реализованы для операторов INNER JOIN и CROSS JOIN со следующими стандартными функциями предикатов SQL:
ST_DWithin
ST_Intersects
ST_Contains
ST_Within
ST_Covers
ST_CoveredBy
ST_Equals
ST_Touches
Таким образом, вы не можете ожидать, что LEFT JOIN будет работать должным образом в вашем случае - вместо этого - ваш левый JOIN «конвертируется» в CROSS JOIN с фильтром в условии ON, перемещенным в условие Where
Таким образом, результат, который вы видите, как и ожидалось
Резюме - вам просто нужно переписать ваш запрос: o)
Вы можете попробовать что-то подобное ниже, чтобы обойти (не проверено - просто возможное направление для вас)
#standardSQL
SELECT tt.customer_id, t.geolatitude, t.geolongitude, tt.name
FROM `project.dataset.table_customer_x` t
JOIN `project.dataset.table_location` tt
ON ST_DWITHIN(ST_GEOGPOINT(t.geoLatitude,t.geoLongitude), ST_GEOGPOINT(tt.latitude, tt.longitude), 250)
UNION ALL
SELECT tt.customer_id, t.geolatitude, t.geolongitude, tt.name
FROM `project.dataset.table_customer_x` t
JOIN `project.dataset.table_location` tt
ON NOT ST_DWITHIN(ST_GEOGPOINT(t.geoLatitude,t.geoLongitude), ST_GEOGPOINT(tt.latitude, tt.longitude), 250)
WHERE tt.customer_id= 204
AND t.timestamp > "2016-01-01"
AND tt.latitude <= 90 AND tt.latitude >= -90