SQL - 合并具有重叠日期的行中的数据

时间:2013-04-01 15:56:52

标签: sql-server-2008 sql-server-2008-r2

我有一个表(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

感谢您抽出宝贵时间阅读本文。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果将来有人遇到此类问题,我通过使用游标循环记录并将任何重叠的组合在一起解决了我的问题。在对临时表运行SELECT语句之前,在光标运行时将结果存储在临时表中。我可以在修改后的SQL Fiddle上找到我所做的迭代。

我将这些数据导入SSRS后,我使用子报告返回与每组记录相关的JobID,从而实现了我在问题中证明的结果。

我希望这对那些遇到与我有同样问题的人有用。