У меня есть две таблицы 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_]