我有多个具有多个时间范围的表,当所有表重叠时,我需要计算重叠时间,但否则不需要计算。
在下面的示例中,我只需要对带有边框的时间范围进行时间求和:
不能只使用基本的 theta 连接,因为 A 并不总是 X 等。
示例表:
PLACE 1 PLACE 1 TIME IN PLACE 1 TIME OUT PLACE 2 PLACE 2 TIME IN PLACE 2 TIME OUT PLACE 3 PLACE 3 TIME IN PLACE 3 TIME OUT
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931 2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931 2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931 2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931 2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931 2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931 2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931 2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931 2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931 2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931 2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931 2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931 2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 12:52:00.000 2013-05-09 14:35:00.000 3931 2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 08:54:00.000 2013-05-09 11:02:00.000 3931 2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929 2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930 2013-05-09 12:52:00.000 2013-05-09 14:35:00.000 3931 2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
好的,这是一个两步过程。首先,您要查找其他表中确实有重叠行的行。
用于查找两个范围之间重叠的古老技术是,仅当范围 A 的开头不晚于范围 B 的结尾且范围 A 的结尾不早于范围 B 的开头时,才存在重叠。
换句话说,如果 B 在 A 结束之前开始,并且 B 也在 A 开始之后结束,则存在重叠。
现在如何在 SQL 中表达这一点:从“根”表开始,将其作为 FROM 子句中的第一个表。我们将其称为 Table1,其中包含 A 列和 B 列(来自您的图像)。
要查找其他两个表中存在重叠的行,请像这样进行 JOIN:
FROM Table1 t1
INNER JOIN Table2 t2
ON t2.E <= t1.B AND t2.F >= t1.A
INNER JOIN Table3 t3 --this table has to overlap both of the others
ON t3.X <= t1.B AND t3.Y >= t1.A
AND t3.X <= t2.F AND t3.Y >= t2.E
通过使用 INNER JOIN,所有三个表中没有重叠的行都将被排除在考虑范围之外。
然后仅返回重叠的周期,获取 MAXt1.A, t2.E, t3.X
作为重叠的开始,并且 MINt1.B, t2.F, t3.Y
作为重叠的结束。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)