Как создать несколько таблиц из большого файла с разделителями в SQL Server и настроить пространственные запросы - PullRequest
3 голосов
/ 26 января 2012

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

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

Ответы [ 2 ]

1 голос
/ 26 января 2012

Я бы порекомендовал вам внимательно взглянуть на Службы интеграции SQL Server (SSIS).

Служба SSIS предназначена для выполнения именно таких задач - она ​​позволяет загружать, анализироватьпреобразовать и в конечном итоге сохранить данные из любых источников в SQL Server.

Вы можете запустить его как однократный импорт или сохранить пакет для последующего повторного использования для дополнительных файлов, которые могут вам понадобиться.импортировать позже.

0 голосов
/ 27 января 2012

Я предполагаю, что вы используете SQL 2008 с поддержкой пространственных данных.

Похоже, у вас может быть несколько заданий на одном сайте (т. Е. Адрес), поэтому я бы создал таблицу заданий с внешним ключом, указывающим на таблицу сайтов, содержащую столбцы для всей информации об адресе и дополнительный столбец. типа География .

Вам потребуется настроить процесс для заполнения столбца с типом географии информацией о геокоде (т. Е. Широтой и долготой адреса), Пакетный геокодер MapPoint - это процесс SSIS, использующий MapPoint (сейчас Карты Bing) Сервис и может стать хорошей отправной точкой для разработки вашего собственного процесса.

Как только вы сможете получить геокод для адреса, обновление таблицы SQL становится простым.

UPDATE Sites
SET GeoLocation = GEOGRAPHY::POINT(@latitude, @longitude, 4326)
WHERE SiteID = @siteId

Независимо от того, где в вашем конвейере вы интегрируете геокодер, я бы порекомендовал вам абстрагировать его таким образом, чтобы вы могли легко сменить поставщика услуг Geocode или указать, какой из них использовать во время выполнения, поскольку все сервисы имеют разные схемы ценообразования. и это может оказаться финансово выгодным использовать один над другим. Например, Google предлагает 912 500 бесплатных запросов в год по 2500 макс. В день без ограничения сеансов, тогда как Bing предлагает только 500 000 запросов в год без ограничения в день, но с ограничением в 125 000 сеансов. Так что для больших пакетных запросов Bing выигрывает, но для каждого элемента или случайных запросов Google выходит на первое место. В конце концов, качество данных этих служб сопоставимо, поэтому не стоит менять источник, чтобы избежать платы.

После импорта данных и заполнения геокодов становится легко вычислять расстояния и находить ближайших соседей.

DECLARE @Sites TABLE ( SiteId INT )

--Get the site ids you care about
INSERT INTO @Sites
SELECT SiteId FROM Jobs WHERE Status = 'Open'

/*
 *  For each site in your table variable @Sites, this will list 
 *  all the other sites in the variable in order of distance.
 */
SELECT p.SiteId
     , s.SiteId
     , p.GeoLocation.STDistance(s.SiteId) * 0.001 AS [Distance (Kilometers)] --https://www.google.com/search?q=meters+to+kilometers
     , p.GeoLocation.STDistance(s.SiteId) * 0.000621371192 AS [Distance (Miles)] --https://www.google.com/search?q=meters+to+miles
FROM Sites AS [p]
JOIN Sites AS [s]
    ON s.SiteId != p.SiteId
    AND s.SiteId IN (SELECT SiteId FROM @Sites)
WHERE p.SiteId IN (SELECT SiteId FROM @Sites)
ORDER BY p.SiteId, s.SiteId, p.GeoLocation.STDistance(s.GeoLocation)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...