рассчитать минимальное расстояние каждого магазина местоположения sql запроса - PullRequest
1 голос
/ 15 октября 2019

У меня есть таблица с координатами X, Y каждого магазина. Я хочу найти минимальное расстояние друг с другом. Я имею в виду ближайший магазин.

Например: (требуемый вывод)

Shop_ID      Nearest_Shop_ID 
Shop_1       Shop_5
Shop_2       Shop_8
Shop_3       Shop_4


Select SHOP_ID, Longtitude, Latitude From PARTNER_ADDRESSES
group by SHOP_ID, Longtitude, Latitude;

Это таблица координат моего магазина;

SHOP_ID     LONGTITUDE  LATITUDE
38599       32.815282   39.882793
38613       25.965545   42.166315
38682       31.845157   37.419859
38686       34.027568   38.370871

У меня есть формула, которая может рассчитатьрасстояние между двумя точками (с использованием широты и долготы). Это формула:

(NVL(6387.7,0) * ACOS((sin(NVL(Latitude1,0) / 57.29577951) * SIN(NVL(Latitude2,0) / 57.29577951)) +
        (COS(NVL(Latitude1,0) / 57.29577951) * COS(NVL(Latitude2,0) / 57.29577951) *
         COS(NVL(Longtitude2,0) / 57.29577951 - NVL(Longtitude1,0)/ 57.29577951))))

Latitude1  : Shop 1's Latitude value
Longtitude1: Shop 1's Longtitude value

Latitude2  : Shop 2's Latitude value
Longtitude2: Shop 2's Longtitude value

Можно ли написать этот тип sql, который будет рассчитывать расстояния для каждого магазина и указывать минимальное значение расстояния для каждого магазина?

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

Я думаю, вы можете использовать cross join, затем row_number:

with distance1 as (
select
pa1.SHOP_ID as shop_id1, pa1.Longtitude longitude_1, pa1.Latitude latitude_1,
pa2.SHOP_ID as shop_id2, pa2.Longtitude longitude_2, pa2.Latitude latitude_2,
<your_distance_formula> as Distance
from PARTNER_ADDRESSES pa1
cross join PARTNER_ADDRESSES pa2
where pa1.SHOP_ID <> pa2.SHOP_ID -- remove record where shops are the same
)

select *
from (
select *,
row_number() over (partition by shop_id1 order by Distance) rn_distance
from distance1
) 
where rn_distance = 1
0 голосов
/ 15 октября 2019

Вы можете использовать self join и analytical function.

Select s1, s2 from
(Select a1.shop_id as s1, a2.shop_id as s2,
Row_number() 
over (partition by a1.shop_id
  Order by <your_formula>) as rn
From partner_adresses a1
Join partner_adresses a2
On (a1.shop_id <> a2.shop_id))
Where rn = 1;

Cheers !!

0 голосов
/ 15 октября 2019

Вы можете сделать каждый магазин против каждого магазина, используя перекрестное объединение, например

select <distance formula> from shops as ashops cross join shops as bshops

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...