SQL: selecting rows where column value changed from previous row
Use rownum
I've got 0.05 seconds on 20000 rows
select a1.*
from (select rownum R_NUM, TIMESTAMP, System, StatusA from TableX) a1
join (select rownum R_NUM, TIMESTAMP, SYSTEM, STATUSA from TABLEX) a2
on a1.R_NUM = a2.R_NUM+1
where a1.system = a2.system
and a1.StatusA != a2.StatusA
SELECT a.*
FROM tableX AS a
WHERE a.StatusA <>
( SELECT b.StatusA
FROM tableX AS b
WHERE a.System = b.System
AND a.Timestamp > b.Timestamp
ORDER BY b.Timestamp DESC
LIMIT 1
)
But you can try this as well (with an index on (System,Timestamp)
:
SELECT System, Timestamp, StatusA, StatusB
FROM
( SELECT (@statusPre <> statusA AND @systemPre=System) AS statusChanged
, System, Timestamp, StatusA, StatusB
, @statusPre := StatusA
, @systemPre := System
FROM tableX
, (SELECT @statusPre:=NULL, @systemPre:=NULL) AS d
ORDER BY System
, Timestamp
) AS good
WHERE statusChanged ;