2013-02-04 57 views
2

可以分析功能可用於從這個甲骨文解析函數塌陷記錄

ssid start_time   end_time    op_code 
65F 08/JAN/2013 14:18:33 08/JAN/2013 14:18:34 2 
65F 08/JAN/2013 14:18:53 08/JAN/2013 14:18:54 2 
65F 08/JAN/2013 14:18:55 08/JAN/2013 14:18:59 3 
65F 08/JAN/2013 14:19:33 08/JAN/2013 14:19:34 2 
65F 08/JAN/2013 14:19:53 08/JAN/2013 14:19:54 2 
65F 08/JAN/2013 14:19:55 08/JAN/2013 14:19:59 3 
72F 08/JAN/2013 14:20:55 08/JAN/2013 14:20:56 2 
72F 08/JAN/2013 14:19:57 08/JAN/2013 14:19:59 2 

摺疊這些記錄的 這個

ssid start_time   end_time    c_dt     op_code 
65F 08/JAN/2013 14:18:33 08/JAN/2013 14:18:54 08/JAN/2013 14:18:59 2 
65F 08/JAN/2013 14:19:33 08/JAN/2013 14:19:54 08/JAN/2013 14:19:59 2 
72F 08/JAN/2013 14:19:57 08/JAN/2013 14:20:56 

或我必須處理這個的只有循環。 我在Oracle 11gR2的

如果下一OP_CODE爲2 那麼END_TIME成爲下一個記錄的END_TIME,我們去更換該記錄的末尾 時間,直到與OP_CODE 3到達一個相同的SSID。 當與OP_CODE 3記錄到達我們產生c_dt這是創紀錄的以相同的SSID END_TIME但OP_CODE 3. 我們從頭再來此過程中爲下一個記錄

如果我們沒有找到用op_code 3記錄特定的ssid,則c_dt將爲空 ,但end_time將是具有相同ssid的下一個記錄的end_time。

希望我是對這個棘手的邏輯

+0

選擇列「c_dt」的條件是什麼? – TechDo

+0

崩潰背後的邏輯是什麼? – Orangecrush

+0

用邏輯更新了這個問題,希望我能夠詳細闡述這種摺疊的棘手邏輯 –

回答

2

清楚,我會是第一個說這是不漂亮,但它應該讓你在正確的方向前進。

首先,使用相應的行號創建一個包含所有記錄的CTE。

其次,創建另一個具有下一個記錄的CTE,其中操作碼不相同。

第三,創建另一個具有最小行數,最大行數和下一行數(可能爲空)的CTE並使用它來獲得結果。

它可以被簡化,但這是我的第一次嘗試。

WITH CTE AS (
    SELECT 
    t.ssid,t.start_time,t.end_time,t.op_code 
    ,ROW_NUMBER() OVER (ORDER BY Start_Time) rn 
    FROM YourTable t 
) , 
CTE2 AS (
    SELECT C.SSID, C.RN, MIN(C2.RN) RN2 
    FROM CTE C 
    LEFT JOIN CTE C2 ON 
     C.RN < C2.RN AND 
     C.OP_CODE <> C2.OP_CODE AND 
     C.SSID = C2.SSID 
    WHERE C.Op_Code = 2 
    GROUP BY C.SSID, C.RN 
) , 
CTE3 AS (
    SELECT SSID, MIN(RN) MinRN, MAX(RN) MaxRN, RN2 
    FROM CTE2 
    GROUP BY SSID, RN2 
) 
SELECT c.ssid, 
    c.start_time, 
    c3.end_time, 
    c4.end_time c_dt, 
    c.op_code 
FROM CTE c 
    JOIN CTE3 c2 ON c.RN = c2.MinRN 
    JOIN CTE c3 ON c2.MaxRN = c3.RN 
    LEFT JOIN CTE c4 ON c2.RN2 = c4.RN 

這裏是SQL Fiddle

祝你好運。

+0

更新後的查詢和小提琴。祝你好運! – sgeddes

+0

Sgeddes輝煌,但你的查詢沒有得到我與ssid 72F的最後一行任何想法如何產生 –

+0

你看到我更新的小提琴? http://sqlfiddle.com/#!4/eb537/1 – sgeddes