I have a very large MySQL table containing data read from a number of sensors. Essentially, there\'s a time stamp and a value column. I\'ll omit the sensor id, indexes other
You might try this - I'm not going to guarantee that it will perform better, but it's my usual way of correlating a row with a "previous" row:
SELECT
* --TODO, list columns
FROM
data d
left join
data d_prev
on
d_prev.time < d.time --TODO - Other key columns?
left join
data d_inter
on
d_inter.time < d.time and
d_prev.time < d_inter.time --TODO - Other key columns?
WHERE
d_inter.time is null AND
(d_prev.value is null OR d_prev.value <> d.value)
(I think this is right - could do with some sample data to validate it).
Basically, the idea is to join the table to itself, and for each row (in d
), find candidate rows (in d_prev
) for the "previous" row. Then do a further join, to try to find a row (in d_inter
) that exists between the current row (in d
) and the candidate row (in d_prev
). If we cannot find such a row (d_inter.time is null
), then that candidate was indeed the previous row.