Tengo una tabla que contiene los tiempos de inicio (utilizando el número en el ejemplo para mantenerlo simple) y la duración de los eventos.Agrupar filas teniendo en cuenta la "diferencia" entre las filas
Me gustaría identificar los "bloques" y su hora de inicio y de finalización.
Cuando la diferencia entre la hora de finalización (hora de inicio + duración) de la fila anterior (ordenada por hora de inicio) y la hora de inicio de la fila actual es >=5
, debe comenzar un nuevo "bloque".
Esta es mi prueba de-datos, incluyendo un intento de explicación gráfica en los comentarios:
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 --# ■■■■■■■■■
El primer bloque comienza a 0
y termina en 4
. Dado que la diferencia a la siguiente fila es >=5
, inicie otro bloque al 10
que termina en 19
.
Puedo identificar la primera fila de un bloque, usando LAG
, pero aún no han encontrado la manera de proceder.
Y podría resolver el problema en un PL/SQL-loop, pero estoy tratando de evitar eso por cuestiones de rendimiento.
¿Alguna sugerencia para formular esta consulta?
Gracias de antemano, Pedro
+1 para los gráficos bastante fresco – thomaspaulb