declare @T table(seq int, item char(1)) insert into @T values ( 1, 'A'), ( 2, 'B'), ( 3, 'C'), ( 4, 'C'), ( 5, 'C'), ( 6, 'B'), ( 7, 'D'), ( 8, 'D'), ( 9, 'C') ;with C as ( select seq, item, 1 as seq2 from @T where seq = 1 union all select T.seq, T.item, C.seq2 + case when C.item <> T.item then 1 else 0 end from @T as T inner join C on T.seq - 1 = C.seq ) select seq, item, seq2 from c order by seq
Update
The version where seq is the date-time. I added an extra CTE that lists the lines sorted by seq.
declare @T table(seq datetime, item char(1)) insert into @T values ( getdate()+1, 'A'), ( getdate()+2, 'B'), ( getdate()+3, 'C'), ( getdate()+4, 'C'), ( getdate()+5, 'C'), ( getdate()+6, 'B'), ( getdate()+7, 'D'), ( getdate()+8, 'D'), ( getdate()+9, 'C') ;with C1 as ( select seq, item, row_number() over(order by seq) as rn from @T ), C2 as ( select seq, item, rn, 1 as seq2 from C1 where rn = 1 union all select C1.seq, C1.item, C1.rn, C2.seq2 + case when C2.item <> C1.item then 1 else 0 end from C1 inner join C2 on C1.rn - 1 = C2.rn ) select seq, item, seq2 from C2 order by seq