我有一个带有这个属性的表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:我无法更改数据库中的任何内容,我只能读取数据。
答案 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;
这假设日期/时间值对于给定的“核心”是唯一的。