Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête SQL qui obtient tous les codes postaux (adresse) dans un rayon de 20 miles autour d'un code postal donné

J'utilise une UDF en raison de la complexité du calcul.

Ici, vous passez la Lat/Lng de base avec la Lat/Lng à tester

Pour être clair : La distance est "à vol d'oiseau" et NON la distance de conduite.

Par exemple :

Declare @BaseZip  varchar(10) = '02806'
Declare @Within   int         = 20

Select Distinct
       BaseZip = A.ZipCode
      ,B.ZipCode
      ,B.CityName
      ,B.StateCode
      ,Miles = [dbo].[udf-Geo-Calc-Miles] (A.Lat,A.Lng,B.Lat,B.Lng)
 From (Select Distinct ZipCode,Lat,Lng From [dbo].[ZipCodes] where [email protected]) A
 Join [dbo].[ZipCodes] B
   on [dbo].[udf-Geo-Calc-Miles] (A.Lat,A.Lng,B.Lat,B.Lng) <= @Within
 Order By 5 

Retours

L'UDF si intéressé

CREATE Function [dbo].[udf-geo-Calc-Miles] (@Lat1 float,@Lng1 float,@Lat2 Float,@Lng2 float)  
Returns Float as  
Begin 
   Declare @Miles Float = (Sin(Radians(@Lat1)) * Sin(Radians(@Lat2))) + (Cos(Radians(@Lat1)) * Cos(Radians(@Lat2)) * Cos(Radians(@Lng2) - Radians(@Lng1)))
   Return Case When @Miles is null then 0 else abs((3958.75 * Atan(Sqrt(1 - power(@Miles, 2)) / @Miles))) end
End

Vous remarquerez peut-être des kilomètres répétés/identiques. Comme vous le savez peut-être, les villes peuvent avoir des noms alternatifs, par exemple Brown University et Brown Station se trouvent à Providence, RI, mais l'organisation peut également avoir son propre code postal.