Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Abfrage, die alle Postleitzahlen (Adressen) innerhalb eines 20-Meilen-Radius einer bestimmten Postleitzahl abruft

Aufgrund der Komplexität der Berechnung verwende ich eine UDF.

Hier übergeben Sie den Basislat/Lng zusammen mit dem zu testenden Lat/Lng

Um es klar zu sagen: Die Entfernung ist "Luftlinie" und NICHT Fahrstrecke.

Zum Beispiel:

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 

Rückgabe

Die UDF bei Interesse

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

Möglicherweise bemerken Sie einige sich wiederholende/identische Meilen. Wie Sie vielleicht wissen, können Städte alternative Namen haben, z. B. Brown University und Brown Station befinden sich in Providence, RI, aber Organisationen können auch ihre eigene Postleitzahl haben.