sql >> Databáze >  >> RDS >> Mysql

Jak efektivně určit změny mezi řádky pomocí SQL

Můžete zkusit toto – nezaručuji, že bude fungovat lépe, ale je to můj obvyklý způsob, jak porovnat řádek s „předchozím“ řádkem:

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)

(Myslím, že je to správné – mohl bych si vystačit s nějakými ukázkovými daty k ověření).

V zásadě jde o to, spojit tabulku k sobě a pro každý řádek (v d ), najděte kandidátní řádky (v d_prev ) pro "předchozí" řádek. Poté proveďte další spojení a pokuste se najít řádek (v d_inter ), který existuje mezi aktuálním řádkem (v d ) a řádek kandidáta (v d_prev ). Pokud takový řádek nemůžeme najít (d_inter.time is null ), pak byl tímto kandidátem skutečně předchozí řada.



  1. Jak vypnout zobrazování chyb mysql na obrazovce v CodeIgniter

  2. MySQL SELECT x FROM a WHERE NOT IN ( SELECT x FROM b ) – Neočekávaný výsledek

  3. MySQL:data před rokem 1970

  4. PostgreSQL:Auto-inkrement založený na vícesloupcovém jedinečném omezení