Запрос набора данных для получения расстояния с использованием функции широты / долготы - PullRequest
0 голосов
/ 06 мая 2011

Доброе утро,

Я работаю над проектом для работы и нахожусь в тупике.То, что я пытаюсь сделать, это взять список записей (в нем хранятся почтовый индекс, широта и долгота магазина) и поместить их на ближайший рынок.

У меня есть функция, которая сравнивает 2 почтовых индексаи связанные с ними широты и долготы и получить расстояние.Функция прекрасно работает при вводе записей по одному за раз.

Я пытаюсь найти способ заставить функцию работать с заданными записями по 1 за раз и дать мне расстояние.

В настоящее время у меня есть:

объявить @i int
выбрать @i = min (RowID) из # unmatched2
объявить @max int
выбрать @max= max (RowID) из # unmatched2, в то время как @i <= @max begin <br>выберите Zipcode, Longitude, Latitude из # unmatched2, где RowID = @i

DECLARE @Lat1 float
DECLARE @Long1 float
DECLARE @Lat2 float
DECLARE @Long2 float

SELECT  @Lat1 = max(Latitude) from #unmatched2 
where   RowID = @i
SELECT  @Long1 = max(Longitude) from #unmatched2 
where   RowID = @i
SELECT  @Lat2 = max(Latitude) from ProgramManagement.dbo.zipcode_lookup 
where   ZIPCode = 92101
SELECT  @Long2 = max(Longitude) from ProgramManagement.dbo.zipcode_lookup 
where   ZIPCode = 92101
select ProgramManagement.dbo.CoordinateDistanceMiles(@Lat1, @Long1, @Lat2, @Long2)
set @i = @i + 1  end

@ database - моя временная таблица.используя, чтобы получить количество строк.например, в этом случае я использую #unmatched.

Пример записи:

 Zipcode, latitude , longitude 
 92101 , 32.7152778, -117.1563889 

Результатом будет просто одно число на расстоянии:

140.01 

Таким образом, временная таблица будет иметь ~ 1300 записей ивыходные данные будут представлять собой одно число для каждой строки.

В настоящее время вышеприведенное работает и проходит через всю таблицу, но мои результаты выдаются в отдельных результатах.1-е:

Zipcode Longitude   Latitude
93510   -118.1824020000 34.4679410000

2-е:

Distance
134.035921098023

То, что мне нужно, это просто список результатов от 1 до конца вместо того, что я получаю в настоящее время.Какие-либо предложения?Или есть способ получить результаты:

Zipcode     Longitude       Latitude        Distance
93510       118.1824020000  34.4679410000   134.035921..

1 Ответ

0 голосов
/ 06 мая 2011

Я думаю, вы просто пытаетесь найти расстояние от каждой записи в вашей таблице #unmatched2 до отдельной записи в таблице zipcode_lookup.Логика установки для этого - простое соединение, затем просто выполните вычисление расстояния в select.

SELECT u.RowID, u.Zipcode, u.Longitude, u.latitude,
    ProgramManagement.dbo.CoordinateDistanceMiles(u.Latitude, u.Longitude, z.Lat, z.Long) dist
FROM #unmatched2 u
  CROSS JOIN (
    SELECT max(Latitude) Lat, max(Longitude) Long
    FROM ProgramManagement.dbo.zipcode_lookup
    WHERE ZIPCode = 92101
  ) z

Это предполагает, что RowID является уникальным идентификатором, если не простая группа на нем ...это на самом деле ближе к тому, что делает ваш цикл)

SELECT u.RowID, u.Zipcode,
    max(u.Longitude) Longitude, max(u.latitude) Latitude,
    ProgramManagement.dbo.CoordinateDistanceMiles(max(u.Latitude), max(u.Longitude), z.Lat, z.Long) dist
FROM #unmatched2 u
  CROSS JOIN (
    SELECT max(Latitude) Lat, max(Longitude) Long
    FROM ProgramManagement.dbo.zipcode_lookup
    WHERE ZIPCode = 92101
  ) z
GROUP BY u.RowID, u.Zipcode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...