Расстояние между точками географии возвращают каждый ТОП 1 - PullRequest
0 голосов
/ 11 июня 2019

У меня есть две таблицы sql server 2016: Клиенты, которые имеют около 200 тыс. Строк Магазины на 100 рядов

Обе таблицы содержат поле географии.

Для каждого покупателя мне нужно найти ближайший магазин.

Я создал код ниже, который дает правильные результаты, но возвращает расстояние между каждым магазином и покупателем, и мне нужен ТОП 1 для каждого покупателя. Я мог бы создать ROW_NUMBER и затем = 1, но я беспокоюсь о количестве данных, которые это создаст в cte, и о том, сколько времени потребуется для запуска.

select t1.[CustNo_],t1.Latitude, t1.Longitude,t1.GeoLoc
      ,t2.[ShopCode]
      ,t1.GeoLoc.STDistance(t2.GeoLoc)/1000 as DistanceApartKM
from #Customers t1
join #Shops t2
on (t1.GeoLoc.STDistance(t2.GeoLoc) <= 10000)
order by t1.[CustNo_], DistanceApartKM

Сейчас я собираюсь попробовать предложение использовать Cross Apply, исправленный код ниже.

select t1.[CustNo_],t1.Latitude, t1.Longitude,t1.GeoLoc
      ,x.[ShopCode]
      ,x.DistanceApartKM
from #Customers t1
cross apply (select top 1 t2.[ShopCode]
            ,t1.GeoLoc.STDistance(t2.GeoLoc)/1000 as DistanceApartKM
             from #Shops t2
             where (t1.GeoLoc.STDistance(t2.GeoLoc) <= 10000)
         order by DistanceApartKM
        ) x
 order by t1.[CustNo_]
...