确定最大并行运行任务

时间:2016-05-05 22:13:19

标签: sql sql-server

如下表所示,考虑一个任务表,其中包含从开始到结束时的时间。

我需要找到最佳方法/ SQL查询,以便在运行的最大任务数量为1秒精度或范围时找到前5次

TaskID |    StartDateTime           |   EndDateTime
1      |    2016-04-23 10:29:48.643 |   2016-04-23 10:29:53.077
2      |    2016-04-23 10:32:58.797 |   2016-04-23 10:33:01.643
3      |    2016-04-23 10:36:09.227 |   2016-04-23 10:36:12.270
4      |    2016-04-23 10:46:58.093 |   2016-04-23 10:47:01.863
5      |    2016-04-23 10:53:08.107 |   2016-04-23 10:53:12.683

所以输出可以像

DateTime            | NoOfTasksRunning
2016-04-23 10:29:48 | 5
2016-04-23 12:29:48 | 4
2016-04-23 10:59:48 | 4
2016-04-23 01:29:48 | 1

或者喜欢

Duration                                   | NoOfTasksRunning
2016-04-23 10:29:48 to 2016-04-23 10:29:58 | 5
2016-04-23 10:39:48 to 2016-04-23 10:59:00 | 4
2016-04-23 01:29:48 to 2016-04-23 02:29:58 | 1

最明显的答案是找到最大和最小的日期时间并循环每一秒并获得计数,但这不是最有效的方法,所以请不要把它作为你的答案。(希望它不是唯一的方式)

注意:上面不同表格之间的数据没有相关性。它们只是提供所需输出或一般所需输出的示例。

没有SQL版本限制,只是它必须是MS SQL而没有MySQL或oracle查询。

1 个答案:

答案 0 :(得分:0)

所以,我通过查找所有开始日期和结束日期来解决它,将它们分组到单个列中,命令它们升序并保持唯一。

这给了我关键日期时间列表,其间没有工作就没有改变。

然后,我使用关键日期时间表列表来定义时间跨度的开始和结束日期,并找出在该时间跨度内运行的作业数量。这给了我在不同时间跨度运行的工作数量。

按照NoOfJobsRunning的顺序排序,在我的问题中给了我第二个版本的输出。