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 .