Возвращать записи в хронологическом порядке, учитывая коэффициент разделения - PullRequest
1 голос
/ 13 декабря 2011

У меня есть массивная таблица в SQLServer 2008 , она содержит положение, сообщаемое техническими специалистами каждую минуту. Мне нужно составить отчет по этой таблице, но для контроля количества записей, отображаемых в отчете, необходимо учитывать как факторы разделения по времени, так и по расстоянию.

Итак, запрос может выглядеть как

"Return all records with no less than 5 minutes and/or 300 feet between them".

Часть времени закончена, но мне трудно с коэффициентом расстояния. У меня есть широта и долгота для каждой точки, и у меня нет проблем, если мне нужно включить пространственный UDT SQLServer 2008 для решения проблемы.

Вещи, которые я рассмотрел:

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

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

  3. Используйте пространственные функции в SQLServer 2008 , но, честно говоря, я читал и не смог найти ничего, что помогло бы мне решить этот тип требований. Любой специалист по ГИС ??

Я бы хотел выбрать лучший вариант (возможно, не перечисленный выше?), И именно IMO должен наиболее эффективно использовать функции SQLserver.

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Рэйсиэль спрашивает, как «упростить» список точек на коэффициент расстояния.Предположим, у вас есть список из ста пространственных точек, отсортированных по dateTime, и расстояние между одной точкой от предыдущей составляет ровно 150 футов, ему нужно получить только список точек, расстояние которых составляет 300 футов, результирующий набор должен быть спискомоколо 50 баллов ... Я просто представляю, как сделать это с помощью курсора.

0 голосов
/ 14 декабря 2011

До SQL 2008 наиболее распространенным решением было использование UDF для вычисления расстояния между двумя точками на сфере. Формула Хаверсайна , вероятно, является наиболее часто используемым методом.

Конечно, Земля на самом деле не является идеальной сферой, но это считалось "достаточно хорошим" для большинства применений.

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

DECLARE @locations TABLE(locname VARCHAR(100), coord geography)
DECLARE @loc1 geography
DECLARE @loc2 geography


INSERT INTO @locations 
VALUES('HOME', geography::Point(-81.810194, 41.478156, 4326))   --Note: Lat, Long, SRID
                                                                --The 4326 is the SRID (spatial reference id) used by SQL as 
                                                                --a reference to the WGS 84 Standard. This is the same reference
                                                                --used by the GPS system
INSERT INTO @locations 
VALUES('WORK', geography::Point(-81.687771, 41.498227, 4326))

SELECT * FROM @locations

SELECT @loc1 = coord FROM @locations WHERE locname = 'HOME'
SELECT @loc2 = coord FROM @locations WHERE locname = 'WORK'

SELECT @loc1.STDistance(@loc2) * 3.2808399  --STDistance is in meters so we multiply to convert to feet 

SRID - ключ к повышению точности.Спецификация WGS 84 , к которой она относится, включает в себя стандартизированную систему координат и эталонный эллипсоид.Другими словами, это объясняет несферическую природу Земли, давая лучшие результаты, чем чисто сферический расчет Великого круга.

Если точность ГИС важна для вашей работы, это самый простой способ реализовать ее в SQL 2008.

0 голосов
/ 13 декабря 2011

Формула:

3949.99 * arcos(sin(LAT1) * sin(LAT2) + cos(LAT1) * cos(LAT2) * cos(LONG1 - LONG2))

Радиус Земли составляет 3949,99 миль.Все остальное говорит само за себя.Эта формула является формулой расчета расстояния большого круга.

...