Ich habe eine Tabelle, die Startzeiten enthält (mit der Nummer im Beispiel, um es einfach zu halten) und die Dauer von Ereignissen.Gruppierung der Zeilen unter Berücksichtigung der "Differenz" zwischen den Zeilen
Ich möchte "Blöcke" und ihre Start- und Endzeit identifizieren.
Immer wenn der Unterschied zwischen der Endzeit (Startzeit + Dauer) der vorherigen Zeile (sortiert nach Startzeit) und der Startzeit der aktuellen Zeile >=5
ist, sollte ein neuer "Block" beginnen.
Dies ist mein Test-Daten, einschließlich dem Versuch einer graphischen Erklärung in den Kommentaren:
WITH test_data AS (
SELECT 0 s, 2 dur FROM dual UNION ALL --# ■■
SELECT 2 , 2 FROM dual UNION ALL --# ■■
SELECT 10 , 1 FROM dual UNION ALL --# ■
SELECT 13 , 4 FROM dual UNION ALL --# ■■■■
SELECT 15 , 4 FROM dual --# ■■■■
)
--# Should return
--# 0 .. 4 --# ■■■■
--# 10 .. 19 --# ■■■■■■■■■
Der erste Block an 0
beginnt und endet bei 4
. Da der Unterschied zur nächsten Zeile >=5
ist, starten Sie einen weiteren Block unter 10
, der auf 19
endet.
kann ich die erste Zeile eines Blocks identifizieren, mit LAG
, aber ich habe noch nicht herausgefunden, wie es weitergeht.
Und ich könnte das Problem in einer PL/SQL-Schleife lösen, aber ich versuche, das aus Leistungsgründen zu vermeiden.
Haben Sie Vorschläge zum Schreiben dieser Abfrage?
Vielen Dank im Voraus, Peter
+1 für ziemlich coole Grafiken – thomaspaulb