sql >> Database teknologi >  >> RDS >> Sqlserver

SQL-forespørgsel, der henter alle postnumre (adresse) inden for en radius på 20 mil fra et givet postnummer

Jeg bruger en UDF på grund af kompleksiteten af ​​beregningen.

Her passerer du basis Lat/Lng sammen med Lat/Lng, der skal testes

For at være klar: Afstanden er "i luftlinje" og IKKE køreafstand.

For eksempel:

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 

Returnerer

UDF hvis interesseret

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 vil muligvis bemærke nogle gentagne/identiske miles. Som du måske ved, kan byer have alternative navne, f.eks. Brown University og Brown Station i Providence, RI, men organisationen kan også have deres eget postnummer.




  1. Rækkenummer for forespørgselsresultater grupperet efter en kolonne

  2. Sådan bruger du en fremmednøgle, når du forespørger fra to tabeller

  3. Tilbagekald adgang til postgres-database for en rolle

  4. Hvad er den bedste måde at validere XML mod XML-skema, parse det og gemme data tilbage til MySQL-databasen ved hjælp af Perl?