2013-07-22 77 views
0

我有一个日志表中有这样的事情:SQL查询Oracle日志分析

tablelog

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 ...我怎样才能解决这个问题?

谢谢!

+0

为什么它应该返回3记录?我只看到2条满足您查询的记录。 – araknoid

+0

什么是防止在您的查询中的第一个事件匹配的最后一个事件? – Mat

+1

你不应该存储在VARCHAR列日期和时间戳。你为什么不用一个'timestamp'来代替? –

回答

1

据我了解,你要列出顺序起动/按计划停止该使用LEAD到做一个CTE的工作,然后只过滤,并使用外部查询订单;

WITH cte AS (
    SELECT 
    CASE WHEN "event"='executing' THEN "date" || "time" END "datetimeStart", 
    LEAD(CASE WHEN "event"='end ok' THEN "date" || "time" END) 
    OVER(PARTITION BY "program" ORDER BY "date","time") "datetimeStop", 
    "program", "ordendate" 
    FROM tablelog 
) 
SELECT * FROM cte 
WHERE "datetimeStart" IS NOT NULL 
    AND "datetimeStop" IS NOT NULL 
ORDER BY "datetimeStart" 

An SQLfiddle to test with

+0

它的工作原理。感谢它是完美的! – user2607028

1

,你正在试图做的查询是最好的使用分析功能lag()lead()完成:

select dateTimeStart, dateTimeStop, program, orderdate 
from (select tl.date || tl.time as datetimeStart, 
      lead(tl.date || tl.time) over (partition by program order by date, time) as dateTimeStop, 
      tl.* 
     from tablelog tl 
    ) tl 
where tl.event = 'Executing'; 
0

我认为,上述将返回以下3个记录: -

  1. 第一记录与第二记录匹配
  2. 第一记录与第四记录匹配
  3. 与4个R匹配第三记录的eCord。

要解决,请尝试以下查询(未经测试): - (?)

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 
+0

是的,你是对的。它不起作用。 – user2607028