sql >> Database >  >> RDS >> Sqlserver

SQL-query die alle postcodes (adres) binnen een straal van 20 mijl van een bepaalde postcode krijgt

Ik gebruik een UDF vanwege de complexiteit van de berekening.

Hier passeer je de basis Lat/Lng samen met de te testen Lat/Lng

Om duidelijk te zijn: De afstand is "hemelsbreed" en NIET rijafstand.

Bijvoorbeeld:

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 

Retourneren

De UDF indien geïnteresseerd

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

U kunt enkele herhalende/identieke kilometers opmerken. Zoals u wellicht weet, kunnen steden alternatieve namen hebben, bijvoorbeeld Brown University en Brown Station is in Providence, RI, maar organisaties kunnen ook hun eigen postcode hebben.




  1. Tekst zoeken en vervangen in MySQL-database met behulp van SQL

  2. Waarom worden 2 rijen beïnvloed in mijn `INSERT ... ON DUPLICATE KEY UPDATE`?

  3. Het aantal keren dat een subtekenreeks binnen een tekenreeks voorkomt tellen in PostgreSQL

  4. Een database-e-mailprofiel bijwerken in SQL Server (T-SQL)