Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionner lors du changement de valeur

C'est une sorte de problème de trous et d'îlots. Les îlots sont des lignes adjacentes qui ont le même batchnum , et vous voulez le début de chaque île.

Ici, l'approche la plus simple est probablement lag() :

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

Notez que cela nécessite MySQL 8.0. Dans les versions antérieures, une alternative utilise une sous-requête corrélée :

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
)

Voici une démo sur DB Fiddle .