sql >> Databáze >  >> RDS >> Sqlserver

SQL dotaz, který získá všechna PSČ (adresu) v okruhu 20 mil od daného PSČ

Používám UDF kvůli složitosti výpočtu.

Zde předáte základní zeměpisnou šířku/délku spolu se zeměpisnou šířkou/délkou, která má být testována

Aby bylo jasno: Vzdálenost je "vzdušnou čarou" a NE dojezdová vzdálenost.

Například:

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 

Vrátí

V případě zájmu UDF

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ůžete si všimnout několika opakujících se/identických kilometrů. Jak možná víte, města mohou mít alternativní názvy, například Brown University a Brown Station je v Providence, RI, ale organizace může mít také své vlastní PSČ.




  1. Časové razítko PHP/MySQL bude vypadat atraktivněji

  2. Získejte datový rámec R se sloučenými hodnotami z více tabulek MySQL

  3. zastavení při chybě kompilace ve skriptu sqlplus

  4. Jak upgraduji databázi osCommerce z v2.2 na v2.3