地理点之间的距离各返回前1名

时间:2019-06-11 12:12:15

标签: sql tsql sql-server-2016

我有两个SQL Server 2016表: 拥有约20万行的客户 有100行的商店

两个表都包含一个地理位置字段。

我需要为每个客户找到最近的商店。

我创建了下面的代码,该代码给出正确的结果,但返回每个商店与客户之间的距离,我只需要为每个客户提供TOP 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_]

0 个答案:

没有答案