Antag, at der er en unik id-kolonne og for at gøre tingene interessante, at den ikke sporer stigningerne i tidsstempelkolonnen. Antag også, at der ikke er nogen tidsstempler, der er ens.
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;
Forklaring:s1 giver par af tider, der er før og efter hinanden. pn grupperer dem for at få en liste over alle tilstødende par gange. pt giver resten af kolonnerne for den forrige gang i pn, og nt giver resten af kolonnerne til næste gang. Når kolonnen, som jeg kaldte ncol, skifter værdier, bliver den foregående række spyttet ud i resultatsættet. Hvis der er flere nonnull-værdier, og det kun var interessant at finde skift mellem null og non-null, så skift pt.ncol!=nt.ncol til isnull(pt.ncol)!=isnull(nt.ncol).