我有很多带有给定ID的开始和停止时间的数据,需要将所有相交和相邻的时间段合并为一个组合时间段。下面发布的样本数据都属于同一ID。
为了使事情更清晰,请查看2009年3月6日的样本数据:
以下时间跨度重叠或连续,需要合并成一个时间跨度:
05:54:48 - 10:00:13 09:26:45 - 09:59:40
结果时间跨度将从05:54:48到10:00:13。由于在10:00:13和10:12:50之间存在间隔,因此我们还有以下时间跨度:
10:12:50 - 10:27:25 10:13:12 - 11:14:56 10:27:25 - 10:27:31 10:27:39 - 13:53:38 11:14:56 - 11:15:03 11:15:30 - 14:02:14 13:53:38 - 13:53:43 14:02:14 - 14:02:31
它们会形成一个合并后的时间跨度,从10:12:50到14:02:31,因为它们是相互重叠或相邻的。
下面是我需要的样本数据和展平后的数据。持续时间列只是信息性的。
任何解决方案,无论是SQL还是其他,都可以接受。
编辑:由于有许多不同且有趣的解决方案,我通过添加约束来改进原始问题,以查看最佳(如果有)解决方案是否会浮现:
我通过ODBC从另一个系统获取数据。没有办法为我更改表格布局或添加索引。
该数据仅由日期列进行索引(时间部分不是)。
每天大约有2.5k行。
数据的估计使用模式如下所示:
大多数时间(假设90%),用户只查询一两天(2.5k-5k行)
有时(9%)范围将达到一个月左右(约75k行)
很少(1%)范围将达到一年左右(约900k行)
对于典型情况,查询应快速完成,对于罕见情况,则不应“持续很久”。
查询一年的数据需要约5分钟(无需加入即可选择)
在这些限制条件下,哪种解决方案最好?我担心大多数解决方案将非常缓慢,因为它们基于日期和时间的组合连接,而在我的情况下,这不是索引字段。
您会在客户端还是服务器端执行所有合并操作?您会首先创建一个优化的临时表,并使用其中一种提议的解决方案吗?目前我没有时间测试解决方案,但我会让您知道哪种方法最适合我。
样本数据:
为了使事情更清晰,请查看2009年3月6日的样本数据:
以下时间跨度重叠或连续,需要合并成一个时间跨度:
05:54:48 - 10:00:13 09:26:45 - 09:59:40
结果时间跨度将从05:54:48到10:00:13。由于在10:00:13和10:12:50之间存在间隔,因此我们还有以下时间跨度:
10:12:50 - 10:27:25 10:13:12 - 11:14:56 10:27:25 - 10:27:31 10:27:39 - 13:53:38 11:14:56 - 11:15:03 11:15:30 - 14:02:14 13:53:38 - 13:53:43 14:02:14 - 14:02:31
它们会形成一个合并后的时间跨度,从10:12:50到14:02:31,因为它们是相互重叠或相邻的。
下面是我需要的样本数据和展平后的数据。持续时间列只是信息性的。
任何解决方案,无论是SQL还是其他,都可以接受。
编辑:由于有许多不同且有趣的解决方案,我通过添加约束来改进原始问题,以查看最佳(如果有)解决方案是否会浮现:
我通过ODBC从另一个系统获取数据。没有办法为我更改表格布局或添加索引。
该数据仅由日期列进行索引(时间部分不是)。
每天大约有2.5k行。
数据的估计使用模式如下所示:
大多数时间(假设90%),用户只查询一两天(2.5k-5k行)
有时(9%)范围将达到一个月左右(约75k行)
很少(1%)范围将达到一年左右(约900k行)
对于典型情况,查询应快速完成,对于罕见情况,则不应“持续很久”。
查询一年的数据需要约5分钟(无需加入即可选择)
在这些限制条件下,哪种解决方案最好?我担心大多数解决方案将非常缓慢,因为它们基于日期和时间的组合连接,而在我的情况下,这不是索引字段。
您会在客户端还是服务器端执行所有合并操作?您会首先创建一个优化的临时表,并使用其中一种提议的解决方案吗?目前我没有时间测试解决方案,但我会让您知道哪种方法最适合我。
样本数据:
Date | Start | Stop
-----------+----------+---------
02.06.2009 | 05:55:28 | 09:58:27
02.06.2009 | 10:15:19 | 13:58:24
02.06.2009 | 13:58:24 | 13:58:43
03.06.2009 | 05:54:48 | 10:00:13
03.06.2009 | 09:26:45 | 09:59:40
03.06.2009 | 10:12:50 | 10:27:25
03.06.2009 | 10:13:12 | 11:14:56
03.06.2009 | 10:27:25 | 10:27:31
03.06.2009 | 10:27:39 | 13:53:38
03.06.2009 | 11:14:56 | 11:15:03
03.06.2009 | 11:15:30 | 14:02:14
03.06.2009 | 13:53:38 | 13:53:43
03.06.2009 | 14:02:14 | 14:02:31
04.06.2009 | 05:48:27 | 09:58:59
04.06.2009 | 06:00:00 | 09:59:07
04.06.2009 | 10:15:52 | 13:54:52
04.06.2009 | 10:16:01 | 13:24:20
04.06.2009 | 13:24:20 | 13:24:24
04.06.2009 | 13:24:32 | 14:00:39
04.06.2009 | 13:54:52 | 13:54:58
04.06.2009 | 14:00:39 | 14:00:49
05.06.2009 | 05:53:58 | 09:59:12
05.06.2009 | 10:16:05 | 13:59:08
05.06.2009 | 13:59:08 | 13:59:16
06.06.2009 | 06:04:00 | 10:00:00
06.06.2009 | 10:16:54 | 10:18:40
06.06.2009 | 10:18:40 | 10:18:45
06.06.2009 | 10:23:00 | 13:57:00
06.06.2009 | 10:23:48 | 13:57:54
06.06.2009 | 13:57:21 | 13:57:38
06.06.2009 | 13:57:54 | 13:57:58
07.06.2009 | 21:59:30 | 01:58:49
07.06.2009 | 22:12:16 | 01:58:39
07.06.2009 | 22:12:25 | 01:58:28
08.06.2009 | 02:10:33 | 05:56:11
08.06.2009 | 02:10:43 | 05:56:23
08.06.2009 | 02:10:49 | 05:55:59
08.06.2009 | 05:55:59 | 05:56:01
08.06.2009 | 05:56:11 | 05:56:14
08.06.2009 | 05:56:23 | 05:56:27
展开后的结果:
Date | Start | Stop | Duration
-----------+----------+----------+---------
02.06.2009 | 05:55:28 | 09:58:27 | 04:02:59
02.06.2009 | 10:15:19 | 13:58:43 | 03:43:24
03.06.2009 | 05:54:48 | 10:00:13 | 04:05:25
03.06.2009 | 10:12:50 | 14:02:31 | 03:49:41
04.06.2009 | 05:48:27 | 09:59:07 | 04:10:40
04.06.2009 | 10:15:52 | 14:00:49 | 03:44:58
05.06.2009 | 05:53:58 | 09:59:12 | 04:05:14
05.06.2009 | 10:16:05 | 13:59:16 | 03:43:11
06.06.2009 | 06:04:00 | 10:00:00 | 03:56:00
06.06.2009 | 10:16:54 | 10:18:45 | 00:01:51
06.06.2009 | 10:23:00 | 13:57:58 | 03:34:58
07.06.2009 | 21:59:30 | 01:58:49 | 03:59:19
08.06.2009 | 02:10:33 | 05:56:27 | 03:45:54