我有一个表(JobsLogged),其中包含以下字段和一些示例数据:
JobID Profile LogDate CloseDate
====== ======== =================== ===================
1112 Network 2013-03-05 15:55:00 2013-03-05 16:25:00
1113 Server 2013-03-05 16:00:00 2013-03-06 08:25:00
1114 Server 2013-03-05 16:05:00 2013-03-06 08:30:00
1115 Network 2013-03-05 17:00:00 2013-03-06 09:30:00
1116 Software 2013-03-06 09:00:00 2013-03-07 14:30:00
1117 Network 2013-03-06 10:00:00 2013-03-06 12:00:00
1118 Network 2013-03-06 11:00:00 2013-03-06 12:30:00
1119 Network 2013-03-06 11:30:00 2013-03-06 12:00:00
我需要创建一个报告来计算表中每个配置文件的停机时间。我在 SQL 中创建了一个函数,它获取记录的每个作业的 LogDate 和 CloseDate,并将它们与另一个存储一年中每一天的“潜在正常运行时间”的表进行比较(银行假日、周末等不包括在停机时间计算)。该函数以分钟为单位返回总停机时间并且工作正常。
我遇到的问题是,如果特定配置文件中一个呼叫的 Logdate 和/或 CloseDate 介于上一个呼叫的 LogDate 和 CloseDate 之间,则计算的停机时间将重复,例如:
LogDate CloseDate Downtime
==================== ==================== ==============
2013-03-06 10:00:00 2013-03-06 12:00:00 120 minutes
2013-03-06 11:00:00 2013-03-06 12:30:00 90 minutes
2013-03-06 11:30:00 2013-03-06 12:00:00 30 minutes
--------------
240 minutes
实际上,由于呼叫的重叠时间,停机时间为 150 分钟。我需要按 Profile 对数据进行分组(这很容易),然后合并每个 Profile 组中的行,其中有日期重叠的记录。重叠调用中最早的 LogDate 将成为该组的 LogDate,而该组中最晚的 CloseDate 将成为该组的 CloseDate。
我已经搜索了该站点,这个答案非常接近我想要实现的目标,但是 LEAD 功能似乎直到 2012 版本才在 SQL Server 中实现,而且我相当缺乏经验并且缺乏查找知识一个合适的解决方法。
我已经设置了一个SQL Fiddle,它创建了我正在使用的精简版本。SELECT 语句将在一个过程中使用,该过程将被传递到 SSRS 2008 以运行报告。最终,我希望我的数据以与下面类似的格式显示,但我不知道如何对重叠数据进行分组以实现这一点。
Profile LogDate CloseDate Downtime JobID
======== =================== =================== ========= ======
Network 2013-03-05 15:55:00 2013-03-05 16:25:00 30 1112
------------------- ------------------- --------- ------
2013-03-05 17:00:00 2013-03-06 09:30:00 150 1115
------------------- ------------------- --------- ------
2013-03-06 10:00:00 2013-03-06 12:30:00 150 1117
1118
1119
-------- ------------------- ------------------- --------- ------
Server 2013-03-05 16:00:00 2013-03-06 08:30:00 150 1113
1114
-------- ------------------- ------------------- --------- ------
Software 2013-03-06 09:00:00 2013-03-07 14:30:00 930 1116
感谢您花时间阅读本文。任何帮助将不胜感激。