sql >> Base de Datos >  >> RDS >> Mysql

Cómo determinar de manera eficiente los cambios entre filas usando SQL

Puede probar esto; no voy a garantizar que funcionará mejor, pero es mi forma habitual de correlacionar una fila con una fila "anterior":

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)

(Creo que esto es correcto, le vendría bien algunos datos de muestra para validarlo).

Básicamente, la idea es unir la tabla consigo misma y para cada fila (en d ), busque filas candidatas (en d_prev ) para la fila "anterior". Luego haga una unión adicional, para intentar encontrar una fila (en d_inter ) que existe entre la fila actual (en d ) y la fila candidata (en d_prev ). Si no podemos encontrar dicha fila (d_inter.time is null ), entonces ese candidato era de hecho la fila anterior.