目前我有一张这样建立的桌子
DeviceID Timestamp Value
----------------------------------------
Device1 1.1.2011 10:00:00 3
Device1 1.1.2011 10:00:01 4
Device1 1.1.2011 10:00:02 4
Device1 1.1.2011 10:00:04 3
Device1 1.1.2011 10:00:05 4
Device1 1.1.2011 14:23:14 8
Device1 1.1.2011 14:23:15 7
Device1 1.1.2011 14:23:17 4
Device1 1.1.2011 14:23:18 2
如您所见,来自具有给定时间戳的设备的一些值(列类型为日期时间)。
问题是设备可以在任何时候启动和停止,并且在数据中没有发生启动或停止的直接信息。但是从给定时间戳的列表中很容易判断何时开始和停止发生,因为只要两行的时间戳在五秒内,它们就属于同一个度量。
现在我想从这些数据中得到一个像这样的列表:
DeviceID Started Ended
Device1 1.1.2011 10:00:00 1.1.2011 10:00:05
Device1 1.1.2011 14:23:14 1.1.2011 14:23:18
那么有什么想法可以快速做到这一点吗?我所能想到的就是使用某种游标并手动比较每个日期时间对。但我认为这会变得非常慢,因为我们必须检查每一行中的每个值。
那么有没有更好的 SQL 解决方案不适用于游标?
更新
目前我测试了所有给定的答案。通过阅读,它们看起来都很好,并且有一些有趣的方法。不幸的是,所有这些(到目前为止)在真实数据上都失败了。最大的问题似乎是数据的海量(目前它们在表中大约有 350 万个条目)。仅对一小部分子集执行给定查询会导致预期结果,但将查询滚动到整个表只会导致非常糟糕的性能。
我必须进一步测试和检查我是否可以将数据分块,并且只将部分数据传递给这些给定算法之一以使这件事滚动起来。但也许你们中的一个人有另一个聪明的想法,可以更快地获得结果。
更新(有关结构的更多信息)
好的,这些信息也可能有所帮助:目前表中大约有 350 万个条目。以下是给定的列类型和索引:
- _ID
- 整数
- 首要的关键
- 分组索引
- 在我的示例中没有提到此列,因为此查询不需要它
- 设备ID
- 整数
- 不为空
- 指数
- 时间戳
- 约会时间
- 不为空
- 指数
- 价值
- 几个不同类型的未索引列(int、real、tinyint)
- 都可以为空
也许这有助于改进您对给定问题的已有(或新)解决方案。