Вот код, который немного неуклюжий, но, кажется, работает, в основном для каждой строки я пытаюсь найти более раннюю строку с другим значением.Это делается дважды, один раз для Col1 и один раз для Col2.
Чтобы это работало, мне пришлось добавить уникальное поле PK, которое я не знаю, есть ли у вас или нет, вы можете легко добавить какукажите поле, либо к вашей реальной таблице, либо к таблице, используемой для расчетов.
declare @TestTable table (PK int, PK1 int, Col1 varchar(1), Col2 varchar(1), [Date] date)
insert into @TestTable (PK, PK1, Col1, Col2, [Date])
select 1, 1, 'a', 'e', '10 Jan 2018'
union all select 2, 1, 'b', 'e', '11 Jan 2018'
union all select 3, 2, 'c', 'e', '10 Jan 2018'
union all select 4, 2, 'd', 'f', '11 Jan 2018'
select T1.[Date], T1.PK1, 'Col1', T2.Col1, T1.Col1
from @TestTable T1
inner join @TestTable T2 on T2.PK = (
select top 1 PK
from @TestTable T21
where T21.PK1 = T1.PK1 and T21.Col1 != T1.Col1 and T21.[Date] < T1.[Date]
order by T21.[Date] desc
)
union all
select T1.[Date], T1.PK1, 'Col2', T3.Col2, T1.Col2
from @TestTable T1
inner join @TestTable T3 on T3.PK = (
select top 1 PK
from @TestTable T31
where T31.PK1 = T1.PK1 and T31.Col2 != T1.Col2 and T31.[Date] < T1.[Date]
order by T31.[Date] desc
)
order by [Date], PK1