Dit is een soort van gaps-and-islands-probleem. Eilanden zijn aangrenzende rijen met hetzelfde batchnum
, en je wilt het begin van elk eiland.
Hier is de eenvoudigste aanpak waarschijnlijk lag()
:
select *
from (
select e.*,
lag(batchnum) over(order by time) lag_batchnum
from example e
) e
where not lag_batchnum <=> batchnum
Merk op dat hiervoor MySQL 8.0 vereist is. In eerdere versies gebruikt één alternatief een gecorreleerde subquery:
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 is een demo op DB Fiddle .