基于SQL中的布局和时间记录聚类

时间:2011-03-15 02:10:31

标签: sql-server tsql data-mining cluster-analysis

我想知道你们是否有人根据重叠的时间间隔和位置编写了一个关于记录聚类的查询。 我的应用程序中的数据表示为从开始时间到结束时间在任何给定位置的人的个别事件。位置定义为纬度和经度。在一天中,一个人将有多个不同的位置以及开始和结束时间。我需要让同一时间在同一地点的人群。一个人很可能在一天内分成几组。

Example:
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组(办公室的人员A和B)从上午10点到上午11点,
  • 从中午12点到下午1点的第2组(健身房的人A和C)和
  • 第3组(办公室的人员B和C)从下午1:30到下午5点。

每个人的位置与其他人的位置不完全匹配。我正在使用具有接近阈值的STBuffer的SQL地理点类型并检查STIntersects。我也正在加入桌子以检查时间重叠。但是当人A聚集在一起而没有其他人加入他时,我会遇到一些奇怪的行为。

我想知道是否有处理这种情况的设计模式。理想情况下,我会将记录集分组为“重叠时间段”和“任意几何体的质心”,但无法弄清楚如何获得重叠时间段和任意几何体。

欢迎任何想法并受到高度赞赏。

P.S。编写Windows应用程序不是一种选择,除非它是唯一的方法。

编辑:未能提及群集的位置事先不知道。可能存在无限数量的位置,我的两个或多个客户可能会聚集在一起。我不知道在办公室,健身房,公园或公交车站是否会发生集群。聚类位置(我认为)将是由所有聚集的人的纬度和经度代表的多边形的质心。

2 个答案:

答案 0 :(得分:0)

代码是否类似于

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

答案 1 :(得分:0)

我通过首先获取给定时间段内的整个数据集来解决这个难题。循环记录集并为所有重叠位置生成STUnion形状。然后将生成的临时表连接到初始数据上,并仅获得与STUnion形状相交的记录及时相互映射。 使用了三个临时表但嘿,谁在乎它是否能完成这项工作:)