我一直在努力解决 SQL 中的一些棘手问题,我需要从事件间隔推断资产利用率,并且刚刚了解了Allen 的间隔代数,这似乎是解决这些问题的关键。
代数描述了 13 种区间之间的关系,下图显示了前 7 种关系,其余为逆关系(即 y 在 x 之前,y 遇到 x 等)
但我无法找出如何实施相关操作。
给定我的示例数据,我该如何从 SQL 或 PLSQL 中的以下三种类型的操作中获取结果?
- 脱离
- 减少
- 寻找差距
请查看我的 SQLFiddle 链接: http ://sqlfiddle.com/#!4/cf0cc
原始数据
start end width
[1] 1 12 12
[2] 8 13 6
[3] 14 19 6
[4] 15 29 15
[5] 19 24 6
[6] 34 35 2
[7] 40 46 7
操作 1 - 脱节的结果
我想要一个查询来disjoint set
从上面的数据中返回,其中所有重叠的间隔都被分成几行,这样就不存在重叠了。
我该如何处理这个 SQL?
start end width
[1] 1 7 7
[2] 8 12 5
[3] 13 13 1
[4] 14 14 1
[5] 15 18 4
[6] 19 19 1
[7] 20 24 5
[8] 25 29 5
[9] 34 35 2
[10] 40 46 7
操作 2 - 减少结果
我该如何减少/拉平间隔,使它们是:
- 不为空(即它们具有非空宽度);
- 不重叠;
- 从左到右排序;
- 甚至不相邻(即两个连续范围之间必须有非空间隙)
对于我的示例,这看起来像:
start end width
[1] 1 29 29
[2] 34 35 2
[3] 40 46 7
操作 3 - 差距结果
另外,我如何找到差距?
start end width
[1] 30 33 4
[2] 36 39 4