查询存储在SQL数据库中的使用信息的重叠周期

时间:2010-10-23 14:25:22

标签: sql postgresql timespan

我在PostgreSQL数据库中有一个表,用于跟踪各种资源的使用情况。该表的(简化)模式是每行具有ResourceID,StartTime Timestamp和EndTime Timestamp。表中的每一行代表资源正在使用的时间跨度,因此表可能如下所示:(注意,时间戳还包括日期,为清楚起见,在下面删除)

ResourceID  StartTime   EndTime
---------------------------------------
1           12:30:00    12:45:00
1           12:48:25    12:50:22
2           12:32:50    12:33:44

数据库可能跟踪了数千种不同的资源,表中有几百万行。我最近收到了一份新报告的功能请求,详细说明了一组资源都在使用的时间段,因此查询可能是“在12:00到15:00之间,显示资源1的所有时间段,2,5,8和12都在使用“。此外,查询应具有“最小空闲”时间段,资源在被视为空闲之前需要处于空闲状态(例如:如果最小空闲时间为2秒,则使用的资源为12:00:00-12:01 :00和12:01:01到12:02:00不会被认为有任何空闲时间,即使技术上它没有被使用1秒钟。

查询的输出将是所有查询资源都在使用时的所有时间的开始时间/结束时间列表。从那时起,我需要计算一些关于该数据集的统计数据,这对我来说不会有问题,但我对如何从原始表有效地创建数据集感到茫然。如果有必要,我可以在插入时将额外信息记录到数据库中,如果不是因为仲裁资源子集要求,我可以创建一个包含所有空闲时间的表,但是有1000个不同的资源和任何可能的1-1000组合查询中的资源似乎过多,因为只会报告非常少量的组合。

提前感谢您提供任何帮助或见解。

1 个答案:

答案 0 :(得分:0)

使用期限

使用PostgreSQL 9.2中的范围类型,并检查您所拥有的任何时段的重叠。您可以采用多个重叠段,以便逐步缩小范围。

这不是一件小事,所以我恐怕没有一个简单的例子。

对于空闲时段:

我认为您希望使用某种间隔类型(9.2中的新类型在此处有用)或创建可用于查询目的的类似类型。请注意,在我这样做的地方,它并不是一件容易的事。

您要做的第二件事是创建一个自定义聚合来比较和添加间隔。它需要返回这些类型的数组。最后,您需要能够迭代地运行差异。

这里没有简单的解决方案。所涉及的代码比你可能想要的更复杂,并且通常会从这里得到答案。涉及大量逻辑并涉及设计工作。这很有可能,但并不是非常简单。