Angenommen, es gibt eine eindeutige ID-Spalte, und um die Dinge interessant zu machen, werden die Erhöhungen in der Timestamp-Spalte nicht verfolgt. Gehen Sie außerdem davon aus, dass es keine gleichen Zeitstempel gibt.
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;
Erläuterung:s1 liefert Zeitpaare, die vor- und nacheinander liegen. pn gruppiert sie, um eine Liste aller benachbarten Zeitpaare zu erhalten. pt stellt den Rest der Spalten für das vorherige Mal in pn bereit, und nt stellt den Rest der Spalten für das nächste Mal bereit. Wenn die Spalte, die ich ncol genannt habe, Werte wechselt, wird die vorherige Zeile in die Ergebnismenge ausgespuckt. Wenn es mehrere Nicht-Null-Werte gibt und es nur interessant war, die Schalter zwischen Null und Nicht-Null zu finden, ändern Sie pt.ncol!=nt.ncol in isnull(pt.ncol)!=isnull(nt.ncol).