Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So ermitteln Sie Änderungen zwischen Zeilen mithilfe von SQL effizient

Sie könnten dies versuchen - ich werde nicht garantieren, dass es besser funktioniert, aber es ist meine übliche Methode, eine Zeile mit einer "vorherigen" Zeile zu korrelieren:

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)

(Ich denke, das ist richtig - könnte einige Beispieldaten gebrauchen, um es zu validieren).

Grundsätzlich besteht die Idee darin, die Tabelle mit sich selbst zu verbinden und für jede Zeile (in d ), finden Sie Kandidatenzeilen (in d_prev ) für die "vorherige" Zeile. Führen Sie dann einen weiteren Join durch, um zu versuchen, eine Zeile zu finden (in d_inter ), die zwischen der aktuellen Zeile (in d ) und die Kandidatenzeile (in d_prev ). Wenn wir eine solche Zeile nicht finden können (d_inter.time is null ), dann war dieser Kandidat tatsächlich die vorherige Reihe.