一意のID列があり、タイムスタンプ列の増加を追跡しないことを興味深いものにするとします。また、等しいタイムスタンプがないと仮定します。
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;
説明:s1は、互いの前後にある時間のペアを提供します。 pnはそれらをグループ化して、隣接するすべての時間のペアのリストを取得します。 ptはpnで前回の残りの列を提供し、ntは次回の残りの列を提供します。 ncol switchsという名前の列の値が変わると、前の行が結果セットに吐き出されます。 null以外の値が複数あり、nullとnull以外の切り替えを見つけることだけが面白かった場合は、pt.ncol!=nt.ncolをisnull(pt.ncol)!=isnull(nt.ncol)に変更します。