sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-fråga som får alla postnummer (adress) inom en radie på 20 mil från ett givet postnummer

Jag använder en UDF på grund av beräkningens komplexitet.

Här passerar du basen Lat/Lng tillsammans med Lat/Lng som ska testas

För att vara tydlig: Distansen är "från fågelvägen" och INTE körsträcka.

Till exempel:

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 

Retur

UDF vid intresse

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

Du kan märka några upprepade/identiska mil. Som du kanske vet kan städer ha alternativa namn, till exempel Brown University och Brown Station ligger i Providence, RI, men organisationen kan också ha sitt eget postnummer.




  1. Oracle join-operatör

  2. JavaFX MySQL-anslutningsexempel tack

  3. Hur man använder Alter Table Statement i SQL?

  4. Kan du placera platshållare i utvald del av en fråga med PDO?