Запись кластеризации на основе места и времени в SQL - PullRequest
0 голосов
/ 15 марта 2011

Хотелось бы узнать, написал ли кто-нибудь из вас запрос на кластеризацию записей на основе перекрывающихся временных интервалов И местоположений. Данные в моем приложении представлены как отдельные события человека, находящегося в любом заданном месте от времени начала до конца. Местоположение определяется как широта и долгота. В течение дня у одного человека будет несколько разных мест, а также время начала и окончания. Мне нужно собрать группы людей, которые были в одном месте и в одно и то же время. Один человек, скорее всего, будет в нескольких группах в течение дня.

<b>Example</b>:
Person A can be with Person B at the office from 10 AM to 11 AM.
Then Person A leaves the office for gym.
There he is with Person C from 12 noon to 1PM.
At 12:30 Person C leaves gym for the office.
At 1:30PM I have Person B and C at the office.
Persons B and C leave the office at 5PM.

В этом примере у меня есть

  • Кластер 1 (Лица А и В в офисе) с 10:00 до 11:00,
  • Группа 2 (Лица А и С в тренажерном зале) с 12:00 до 13:00 и
  • Кластер 3 (лица B и C в офисе) с 13:30 до 17:00. * 10101 *

Местоположение каждого отдельного человека не будет точно соответствовать местоположению другого человека. Я использую тип точки географии SQL с STBuffer порога близости и проверяю STIntersects. Я также присоединяюсь к таблице на себя, чтобы проверить перекрытия времени. Но я испытываю некоторые странные формы поведения, когда Персона А сгруппирована сама по себе, когда другой человек никогда не присоединится к нему.

Мне интересно, есть ли шаблон проектирования для обработки подобных ситуаций. В идеале я хотел бы, чтобы набор записей был сгруппирован по «перекрывающемуся периоду времени» и «центроиду произвольной геометрии», но не могу понять, как получить перекрывающийся период времени и произвольную геометрию.

Любые идеи приветствуются и высоко ценятся.

P.S. Написание приложения для Windows не вариант, если только это не единственный способ.

РЕДАКТИРОВАТЬ: Не удалось указать, что места кластеризации никогда не известны заранее. Может быть неограниченное количество мест, где могут кластеризоваться два или более моих клиентов. Я не знаю, будет ли кластеризация происходить в офисе, спортзале, парке или на автобусной станции. Место кластеризации (я думаю) будет Центроид многоугольника, представленного широтами и долготами всех собравшихся людей.

Ответы [ 2 ]

0 голосов
/ 16 марта 2011

Я решил головоломку, сначала получив весь набор данных за данный период времени.Циклический просмотр набора записей и создание фигур STUnion для всех перекрывающихся мест.Затем соедините сгенерированную временную таблицу с исходными данными и получите только те записи, которые во времени пересекались с фигурами STUnion И друг с другомИспользовал три временные таблицы, но, кого волнует, справится ли он с работой:)

0 голосов
/ 15 марта 2011

Будет ли код что-то вроде

select a.person,a.eventtime,a.eventplace,
b.person,b.eventtime,b.eventplace
from people a
join people b on a.eventtime between dateadd(hh,-2,b.eventime) and dateadd(hh,2,b.eventime)
and yourdistancefunction(a.eventplace ,b.eventplace) < 5 -- don't know what you are measuring
and a.person<>b.person
...