2

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

感谢您花时间阅读本文。任何帮助将不胜感激。

4

1 回答 1

0

In case anyone is having trouble with this type of issue in future, I solved my problem by using a cursor to loop through the records and group together any that overlapped. The results of this were stored in a temporary table while the cursor ran, before running the SELECT statement against the temporary table. An iteration of what I did can be found on my modified SQL Fiddle.

Once I had imported this data into SSRS I used a sub-report to return the JobIDs relating to each group of records, thus achieving the result I demonstrated in my question.

I hope this can be of use to others who are having the same problems that I was having.

于 2013-06-01T13:41:22.657 回答