2011-07-14 54 views
1

我有以下格式的數據源:甲骨文 - 幫助作出查詢

Event Type| Date 
1   | 2011-07-14 09:00 
1   | 2011-07-14 09:01 
1   | 2011-07-14 09:02 
2   | 2011-07-14 09:30 
2   | 2011-07-14 09:31 
1   | 2011-07-14 10:00 
1   | 2011-07-14 10:01 

事件類型按日期排序,因爲它們發生。我需要做一個查詢,它會顯示使用事件時的日期範圍,按日期排序。像這樣:

Event Type | Date Range 
1   | 2011-07-14 09:00 - 2011-07-14 09:02 
2   | 2011-07-14 09:30 - 2011-07-14 09:31 
1   | 2011-07-14 10:00 - 2011-07-14 10:01 

你有什麼提示嗎?我認爲這可能需要用分析功能完成,但我還沒有能夠提出一個體面的解決方案。

+1

爲什麼事件類型1輸出中列出兩次?輸出是否應該按小時分組? – Jay

+1

按連續事件分組的事件類型相同,然後查找組中的第一個和最後一個事件。 event_type 1的第二條記錄是事件不是event_type 1後有event_type 1 *的位置。 – MatBailie

回答

2

你也試試下面的辦法:

WITH ranked AS (
    SELECT 
    EventType, 
    Date, 
    ROW_NUMBER() OVER (ORDER BY Date) - 
     ROW_NUMBER() OVER (PARTITION BY EventType ORDER BY Date) AS GroupID 
    FROM Events 
) 
SELECT 
    EventType, 
    MIN(Date) AS StartDate, 
    MAX(Date) AS EndDate 
FROM ranked 
GROUP BY 
    GroupID, 
    EventType 
ORDER BY 
    MIN(Date) 
+0

好思想!謝謝! – Dario

1

我確定有更好的解決方案,但是這個怎麼樣?

WITH 
    ordered_data AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY Date) AS row_id, * FROM event_data 
), 
    [start_events] AS 
(
    SELECT * FROM ordered_data AS [start] 
    WHERE NOT EXISTS (SELECT * FROM ordered_data WHERE row_id = [start].row_id - 1 AND event_type = [start].event_type) 
), 
    [end_events] AS 
(
    SELECT * FROM ordered_data AS [end] 
    WHERE NOT EXISTS (SELECT * FROM ordered_data WHERE row_id = [end].row_id + 1 AND event_type = [end].event_type) 
) 

SELECT 
    * 
FROM 
    [start_events] 
INNER JOIN 
    [end_events] 
    ON [end_events].row_id = (SELECT MIN(row_id) FROM [end_events] WHERE row_id >= [start_events].row_id) 

這也應與場景,其中「組」只有一個事件在它應付;如(1,1,2,1,1)