Detectar intervalos de anomalías con SQL
Mi problema es simple: tengo una tabla con una serie de estados y marcas de tiempo (por curiosidad, estos estados indican niveles de alarma) y me gustaría consultar esta tabla para obtener la duración entre dos estados.
Parece simple, pero aquí viene la parte difícil: no puedo crear tablas de consulta, procedimientos y debería ser lo más rápido posible, ya que esta tabla es un pequeño monstruo con más de 1 billón de registros (¡no es broma!)
El esquema es drop dead simple:
[pk] Valor de tiempo
(Actualmente, hay un segundo pk, pero es inútil para esto)
Y debajo de un ejemplo del mundo real:
Timestamp Status 2013-1-1 00:00:00 1 2013-1-1 00:00:05 2 2013-1-1 00:00:10 2 2013-1-1 00:00:15 2 2013-1-1 00:00:20 0 2013-1-1 00:00:25 1 2013-1-1 00:00:30 2 2013-1-1 00:00:35 2 2013-1-1 00:00:40 0
La salida, considerando solo una alarma de nivel 2, debe ser como sigue, debe informar el comienzo de una alarma de nivel 2 y su finalización (cuando llegue a 0):
StartTime EndTime Interval 2013-1-1 00:00:05 2013-1-1 00:00:20 15 2013-1-1 00:00:30 2013-1-1 00:00:40 10
He intentado todo tipo de uniones internas, pero todas me han llevado a una sorprendente explosión cartesiana. ¿Pueden ustedes ayudarme a encontrar una manera de lograr esto?
¡Gracias!