SQL,从日志表中获取平均作业运行时

时间:2016-12-07 10:40:17

标签: sql sql-server

我有一个带有这个属性的表LOGS:

ID(int)
Date(datetime)
Core(int)
Source(string)
Message(string)

该表包含来自多个作业的日志条目。 作业有多个日志条目,但开始/结束条目始终具有相同的消息。

示例:

->1, 07.12.2016 10:49:00, 2, Some DLL, Calling Execute on CleanUp // Start
  2, 07.12.2016 10:49:01, 3, Other DLL, BLABLABLA
  3, 07.12.2016 10:49:10, 1, Other DLL, BLABLABLA
->4, 07.12.2016 10:50:15, 2, Other DLL, BLABLABLA // Job does sth.
->5, 07.12.2016 10:50:50, 2, Other DLL, Execution completed // End

标有属于同一作业的箭头的行。 正如您所看到的,作业以“调用执行...”开头,以“执行完成”结束。

我想要实现的目标:

我的任务是获得平均工作运行时间。最初的方法是用

过滤
WHERE Message LIKE '%JOBNAME%' OR Message LIKE 'Execution completed'

并比较dateTimes。这适用于某些工作,但有些工作很少运行,所以我只得到“执行完成”,并且手动精确度不是那么好。

最后,我想要一个包含以下属性的列表:

ID(start log), 
Start-Date, 
End-Date, 
Core, 
Source-Start, 
Source-End, 
Message-Start, 
Message-End

所以稍后很容易计算差异并对其进行平均。

我的想法

- >通过搜索消息获得工作。 - >获取一个列表,其中包含“执行已完成”消息:

a higher ID (end log is always after start log)
a later datetime
the same core

例如:

拥有属性

的作业
1, 07.12.2016 11:33:00, 2, Source 1, Calling Execute on job Cleanup

然后使用

搜索所有日志
ID>1, 
dateTime>07.12.2016 11:33:00, 
Core=2, 
Message="Execution completed"

挑选该列表的第一项应该是作业的结束日志

如何使用SQL查询执行此操作?

PS:我无法更改数据库中的任何内容,我只能读取数据。

1 个答案:

答案 0 :(得分:1)

您可以使用相关子查询识别作业以获取下一个结束记录。以下显示了如何获取这些字段:

select l.*, lend.*
from (select l.*,
             (select min(l2.date)
              from logs l2
              where l2.core = l.core and
                    l2.message like '% End'
                    l2.date > l.date
             ) as end_date
      from logs l
      where l.message like '% Start'
     ) l join
     logs lend
     on lend.core = l.core and lend.date = l.end_date;

这假设日期/时间值对于给定的“核心”是唯一的。