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