sql >> Database >  >> RDS >> Mysql

Wijzigingen tussen rijen efficiënt bepalen met behulp van SQL

Je zou dit kunnen proberen - ik ga niet garanderen dat het beter zal presteren, maar het is mijn gebruikelijke manier om een ​​rij te correleren met een "vorige" rij:

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)

(Ik denk dat dit juist is - zou wat voorbeeldgegevens kunnen gebruiken om het te valideren).

In principe is het idee om de tabel aan zichzelf toe te voegen, en voor elke rij (in d ), zoek kandidaat-rijen (in d_prev ) voor de "vorige" rij. Doe dan nog een join, om te proberen een rij te vinden (in d_inter ) die bestaat tussen de huidige rij (in d ) en de kandidatenrij (in d_prev ). Als we zo'n rij niet kunnen vinden (d_inter.time is null ), dan was die kandidaat inderdaad de vorige rij.



  1. Laravel Query Builder verwijderen

  2. Identiteitsachtige kolom maar gebaseerd op Group By-criteria

  3. App Engine en MySQL

  4. Queryresultaten e-mailen als bijlage in SQL Server (T-SQL)