Постановка задачи:
База данных 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>
Пожалуйста, помогите!