SQL: поиск ближайшей записи Lat / Lon в Google BigQuery - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть таблица данных в Google BigQuery с местоположениями, назовите ее TABLE_A.

Вот как выглядит TABLE_A:

ID,Lat,Lon
1,32.95,65.567
2,33.95,65.566

Есть вторая таблица с разными предметами, назовите ее TABLE_B.TABLE_B имеет ту же схему, что и TABLE_A.Это пример из TABLE_B:

ID,Lat,Lon
a,32.96,65.566
b,33.96,65.566

, и я хочу создать новую таблицу, TABLE_C, в которой каждая строка имеет элементы из TABLE_A и TABLE_B, так что элементы находятся ближе всего (то есть расстояние междуширота / долгота - минимальное расстояние при соединении таблиц).Это будет пример TABLE_C с приведенными выше примерами данных:

ID_A,ID_B
1,a
2,b

Мои фактические данные - это таблица свойств с парами широта / долгота с одной стороны и bigquery-public-data.noaa_gsod.stations с другой стороны (яищем ближайшую метеостанцию ​​на собственность).

1 Ответ

0 голосов
/ 31 декабря 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT AS VALUE ARRAY_AGG(STRUCT<id_a INT64, id_b STRING>(a.id, b.id) ORDER BY ST_DISTANCE(a.point, b.point) LIMIT 1)[OFFSET(0)] 
FROM (SELECT id, ST_GEOGPOINT(lon, lat) point FROM `project.dataset.table_a`) a
CROSS JOIN (SELECT id, ST_GEOGPOINT(lon, lat) point FROM `project.dataset.table_b`) b 
GROUP BY a.id

вы можете протестировать, поиграть с ним, используя фиктивные данные из вашего вопроса как

#standardSQL
WITH `project.dataset.table_a` AS (
  SELECT 1 id, 32.95 lat, 65.567 lon UNION ALL
  SELECT 2, 33.95, 65.566
), `project.dataset.table_b` AS (
  SELECT 'a' id, 32.96 lat, 65.566 lon UNION ALL
  SELECT 'b', 33.96, 65.566
)
SELECT AS VALUE ARRAY_AGG(STRUCT<id_a INT64, id_b STRING>(a.id, b.id) ORDER BY ST_DISTANCE(a.point, b.point) LIMIT 1)[OFFSET(0)] 
FROM (SELECT id, ST_GEOGPOINT(lon, lat) point FROM `project.dataset.table_a`) a
CROSS JOIN (SELECT id, ST_GEOGPOINT(lon, lat) point FROM `project.dataset.table_b`) b 
GROUP BY a.id   

с результатом

Row id_a    id_b     
1   1       a    
2   2       b    
...