2013-07-22 75 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