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

Wählen Sie bei Wertänderung

Dies ist eine Art Lücken-und-Inseln-Problem. Inseln sind benachbarte Zeilen, die dieselbe batchnum haben , und Sie möchten den Anfang jeder Insel.

Der einfachste Ansatz ist hier wahrscheinlich lag() :

select *
from (
    select e.*,
        lag(batchnum) over(order by time) lag_batchnum
    from example e
) e
where not lag_batchnum <=> batchnum

Beachten Sie, dass dies MySQL 8.0 erfordert. In früheren Versionen verwendet eine Alternative eine korrelierte Unterabfrage:

select e.*
from example e
where not batchnum <=> (
    select e1.batchnum
    from example e1
    where e1.time < e.time
    order by e1.time desc
    limit 1
)

Hier ist eine Demo zu DB Fiddle .