Supponiamo che ci sia una colonna ID univoca e per rendere le cose interessanti che non tenga traccia degli aumenti nella colonna timestamp. Supponi inoltre che non ci siano timestamp uguali.
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;
Spiegazione:s1 fornisce coppie di volte che sono prima e dopo l'altra. pn li raggruppa per ottenere un elenco di tutte le coppie di volte adiacenti. pt fornisce il resto delle colonne per la volta precedente in pn e nt fornisce il resto delle colonne per la volta successiva. Quando la colonna che ho chiamato ncol cambia valore, la riga precedente viene sputata nel set di risultati. Se sono presenti più valori non Null ed è stato interessante solo trovare le opzioni tra null e non-null, cambia pt.ncol!=nt.ncol in isnull(pt.ncol)!=isnull(nt.ncol).