Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL, które pobiera wszystkie kody pocztowe (adresy) w promieniu 20 mil od danego kodu pocztowego

Używam UDF ze względu na złożoność obliczeń.

Tutaj podajesz podstawową szerokość/długość wraz z sprawdzaną szerokością/dł.

Aby być jasnym: Odległość jest „w linii prostej”, a NIE odległością jazdy.

Na przykład:

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 

Zwroty

UDF w razie zainteresowania

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

Możesz zauważyć kilka powtarzających się/identycznych mil. Jak być może wiesz, miasta mogą mieć alternatywne nazwy, na przykład Brown University i Brown Station znajdują się w Providence, RI, ale organizacja może mieć również własny kod pocztowy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak rzutować podciąg SQL na dziesiętny?

  2. Zarządzaj współbieżnością transakcji za pomocą blokad w SQL Server

  3. Wyrażenie GROUP-BY musi zawierać co najmniej jedną kolumnę, która nie jest odniesieniem zewnętrznym

  4. Wynik procedury składowanej SQL Server 2008 jako wartość domyślna kolumny

  5. Jak porównać, czy dwa ciągi zawierają te same słowa w T-SQL dla SQL Server 2008?