Załóżmy, że istnieje unikalna kolumna identyfikatora i żeby było ciekawiej, że nie śledzi ona wzrostu w kolumnie sygnatury czasowej. Załóż również, że nie ma równych sygnatur czasowych.
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;
Objaśnienie:s1 udostępnia pary czasów, które występują przed i po sobie. pn grupuje je, aby uzyskać listę wszystkich sąsiednich par czasów. pt dostarcza pozostałe kolumny dla poprzedniego czasu w pn, a nt dostarcza pozostałe kolumny dla następnego razu. Kiedy kolumna, którą nazwałem ncol, zmienia wartości, poprzedni wiersz zostaje wyrzucony do zestawu wyników. Jeśli istnieje wiele wartości niepustych i tylko interesujące było znalezienie przełączników między wartościami null i niepustymi, zmień pt.ncol!=nt.ncol na isnull(pt.ncol)!=isnull(nt.ncol).