Předpokládejme, že existuje jedinečný sloupec id, a aby to bylo zajímavé, nesleduje nárůst sloupce časových razítek. Předpokládejme také, že neexistují stejná časová razítka.
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;
Vysvětlení:s1 poskytuje dvojice časů, které jsou před a po sobě. pn je seskupí, aby získal seznam všech sousedních dvojic časů. pt poskytuje zbytek sloupců pro předchozí čas v pn a nt poskytuje zbytek sloupců pro příští čas. Když sloupec, který jsem pojmenoval ncol, přepne hodnoty, předchozí řádek se vyplivne do sady výsledků. Pokud existuje více hodnot než null a bylo zajímavé najít pouze přepínače mezi null a non-null, změňte pt.ncol!=nt.ncol na isnull(pt.ncol)!=isnull(nt.ncol).