sql >> Database teknologi >  >> RDS >> Mysql

Hvordan man effektivt bestemmer ændringer mellem rækker ved hjælp af SQL

Du kan prøve dette - jeg vil ikke garantere, at det vil fungere bedre, men det er min sædvanlige måde at korrelere en række med en "forrige" række på:

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)

(Jeg tror, ​​det er rigtigt - kunne godt trænge til nogle eksempeldata for at validere det).

Grundlæggende er ideen at forbinde tabellen med sig selv og for hver række (i d ), find kandidatrækker (i d_prev ) for den "forrige" række. Foretag derefter en yderligere join for at prøve at finde en række (i d_inter ), der findes mellem den aktuelle række (i d ) og kandidatrækken (i d_prev ). Hvis vi ikke kan finde sådan en række (d_inter.time is null ), så var den kandidat faktisk den forrige række.



  1. Gå gennem kolonnerne i RECORD

  2. Sådan fanges og analyseres SQL Server-hændelser

  3. Top 5 fordele ved at migrere til Azure SQL Database

  4. Sådan gendannes en database med Backup Manager