MySQL не делает это действительно легким.Вы можете получить предыдущую запись, рассчитав предыдущую временную метку и затем присоединив ее. В MySQL 8.0 для этой цели вы можете использовать lag()
.
Затем вам нужно отменить эти значения.MySQL не делает это действительно простым, но вы можете использовать выражения cross join
и case
.Остальное - просто условная логика и фильтрация:
select item, 'TableA' as tableName, colname,
col as newvalue, col_prev as prevvalue, timestamp
from (select t.*, c.colname,
(case when c.colname = 'columnA' then columnA
when c.colname = 'columnB' then columnB
when c.colname = 'columnC' then columnC
end) as col,
(case when c.colname = 'columnA' then tprev.columnA
when c.colname = 'columnB' then tprev.columnB
when c.colname = 'columnC' then tprev.columnC
end) as col_prev
from (select t.*,
(select max(t2.timestamp)
from tablea t2
where t2.item = t.item and t2.timestamp < t.timestamp
) as timestamp_prev
from tablea t
) t join
t tprev
on t.item = tprev.item and t.timestamp_prev = tprev.timestamp cross join
(select 'columnA' as colname union all
select 'columnB' as colname union all
select 'columnC' as colname
) c
) ct
where col_prev <> col;