Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL заявка, която получава всички пощенски кодове (адреси) в радиус от 20 мили от даден пощенски код

Използвам UDF поради сложността на изчислението.

Тук предавате базовата ширина/дължина заедно с ширината/дължината, които трябва да бъдат тествани

За да бъде ясно: Разстоянието е "по права линия", а НЕ с кола.

Например:

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 

Връщане

СДС при интерес

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

Може да забележите някои повтарящи се/идентични мили. Както може би знаете, градовете може да имат алтернативни имена, например университетът Браун и гара Браун са в Провидънс, Род-Айленд, но организацията може също да има свой собствен пощенски код.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TSQL Сравняване на два набора

  2. Свързване на SQL Server 2008 към Outlook Calendar?

  3. Как работи функцията SOUNDEX() на SQL Server

  4. Как да изчистя буфера PRINT в TSQL?

  5. Кодови първи миграции и съхранени процедури