Suponga que hay una columna de identificación única y, para hacer las cosas interesantes, no realiza un seguimiento de los aumentos en la columna de marca de tiempo. Suponga también que no hay marcas de tiempo que sean iguales.
select pt.* from
(Select max(ptime) as prevtime,min(ntime) as nextime from
((Select timestamp as ptime) as prev,
(Select timestamp as ntime) as next
where prev.ptime < next.ntime and prev.id<>next.id) as s1 group by ptime, ntime) as pn
inner join
t as pt on pn.prevtime=pt.timestamp inner join
t as nt on pn.nexttime=nt.timestamp
where pt.ncol!=nt.ncol;
Explicación:s1 proporciona pares de tiempos que son anteriores y posteriores. pn los agrupa para obtener una lista de todos los pares de tiempos adyacentes. pt proporciona el resto de las columnas para la hora anterior en pn, y nt proporciona el resto de las columnas para la próxima vez. Cuando la columna que nombré ncol cambia de valor, la fila anterior se escupe en el conjunto de resultados. Si hay varios valores no nulos y solo era interesante encontrar los cambios entre nulos y no nulos, cambie pt.ncol!=nt.ncol a isnull(pt.ncol)!=isnull(nt.ncol).