SQL查询Oracle日志分析
我有一个类似以下内容的登录表: 台帐SQL查询Oracle日志分析,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个类似以下内容的登录表: 台帐 date | time | event | program | ordendate 20130722 070000 executing program1 20130722 20130722 070040 end ok program1 20130722 20130722 070100 executing program1 20130722 201307
date | time | event | program | ordendate
20130722 070000 executing program1 20130722
20130722 070040 end ok program1 20130722
20130722 070100 executing program1 20130722
20130722 070140 end ok program1 20130722
我有一个问题
select a.date || a.time as datetimeStart,
b.date || b.time as datetimeStop,
a.program, a.ordendate
from tablelog a,
tablelog b
where a.date || a.time < b.date || b.time
and a.event = "executing"
and b.event = "end ok"
此返回3次执行,但只有我有2次。。。如何修复此查询
谢谢 您尝试执行的查询最好使用分析函数lag或lead:
我想,上面会返回以下3条记录:- 第一条记录与第二条记录匹配 第一条记录与第四条记录匹配 第三条记录与第四条记录匹配。 要解决此问题,请尝试以下未测试的查询:-
select * from
(select a.date || a.time as datetimeStart,
b.date || b.time as datetimeStop,
a.program, a.ordendate, row_number() over (partition by (a.date || a.time) order by (a.date || a.time)) rn
from tablelog a,
tablelog b
where a.date || a.time < b.date || b.time
and a.event = "executing"
and b.event = "end ok")
where rn =1
据我所知,您希望按程序列出顺序的开始/停止,该程序使用LEAD在CTE中完成工作,然后使用外部查询进行筛选和排序 以cte为例 选择 事件='executing'然后日期| |时间结束日期时间开始时的情况, LEADCASE当事件='end ok'然后日期| |时间结束时 按日期、时间-日期-时间段、程序顺序超额分配, 程序 从表格日志 从cte中选择* 其中datetimeStart不为NULL 并且datetimeStop不为空 按日期开始订购
.为什么要返回3条记录?我只看到2条满足您的查询的记录。是什么阻止了最后一个事件与查询中的第一个事件匹配?您不应该在varchar列中存储日期和时间戳。为什么不使用一个时间戳呢?它是一个系统日志。。。。我很抱歉。
select * from
(select a.date || a.time as datetimeStart,
b.date || b.time as datetimeStop,
a.program, a.ordendate, row_number() over (partition by (a.date || a.time) order by (a.date || a.time)) rn
from tablelog a,
tablelog b
where a.date || a.time < b.date || b.time
and a.event = "executing"
and b.event = "end ok")
where rn =1