Redshift - вычислить расстояние между двумя геометрическими точками в разных таблицах и выбрать ту, которая имеет наименьшее расстояние - PullRequest
0 голосов
/ 18 февраля 2020

Постановка задачи:

База данных Redshift

Две таблицы

- table_1 is over 1bn records
- table_2 is +-200k records

В обеих таблицах есть столбцы геометрического типа, полученные с помощью ST_MakePoint (lat, long). Значения lat / long представляют местоположения:

table_1 - location of user
table_2 - location of postcode (central point of postcode)

Мне нужно перенести почтовый индекс из table_2 в table_1 на основе следующих критериев:

  • расстояние между геоинтессиями должно быть <( меньше чем) 10 км </li>
  • почтовый индекс, который имеет наименьшее расстояние до геопункта пользователя.

Я выполняю декартово соединение, и оно просто терпит неудачу, и мне интересно, может ли кто-то иметь блестящая идея о том, как запросить эти две таблицы, поскольку я не могу написать ничего, что действительно работает. Вот что у меня есть на данный момент:

with 
origin as 
(select distinct userid, latitude, longitude from table_1),
postcode AS 
(select postcode, postcode_sector, latitude, longitude from table_2),
cartesian as
(select userid
        ,o.latitude
        ,o.longitude
        ,postcode
        ,postcode_sector
        ,ST_DistanceSphere(ST_MakePoint(o.latitude,o.longitude),ST_MakePoint(p.latitude,p.longitude))/1000 as distance
       , MIN(ST_DistanceSphere(ST_MakePoint(o.latitude,o.longitude),ST_MakePoint(p.latitude,p.longitude))/1000) over (partition by o.userid,o.latitude ) as min_distance
  from origin o
  join postcode p on 1 =1 
  where (ST_DistanceSphere(ST_MakePoint(o.latitude,o.longitude),ST_MakePoint(p.latitude,p.longitude))/1000) < 10  ) 

select a.*, b.postcode, b.postcode_sector
from public.table_1 a
left join cartesian b on  a.userid = b.userid and a.latitude = b.latitude
where  distance= min_distance

Есть ли какая-то опция для левого соединения с учетом критериев выбора? По сути, когда кто-то задает критерии <10 км, несколько почтовых индексов совпадают, и из этого подмножества мне нужно взять тот, который находится на наименьшем расстоянии от центра почтового индекса. </p>

Пожалуйста, помогите!

...