我有一个表(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。
我搜索了网站,this answer非常接近我想要实现的目标,但是直到2012版本,LEAD功能似乎没有在SQL Server中实现,而且我相当缺乏经验并且缺乏找到合适的解决方法的知识。
我已经设置了一个SQL Fiddle,它创建了我正在使用的剥离版本。 SELECT语句将用于将传递到SSRS 2008以运行报告的proc中。最终,我希望我的数据以类似于下面的格式显示,但我对如何分组重叠数据以实现此目的感到茫然。
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
感谢您抽出宝贵时间阅读本文。任何帮助将不胜感激。
答案 0 :(得分:0)
如果将来有人遇到此类问题,我通过使用游标循环记录并将任何重叠的组合在一起解决了我的问题。在对临时表运行SELECT语句之前,在光标运行时将结果存储在临时表中。我可以在修改后的SQL Fiddle上找到我所做的迭代。
我将这些数据导入SSRS后,我使用子报告返回与每组记录相关的JobID,从而实现了我在问题中证明的结果。
我希望这对那些遇到与我有同样问题的人有用。