Попробуйте, в этом большом операторе CASE
я увеличиваю столбец на единицу, если checkin
переключается с null
на not null
и наоборот. Тогда достаточно сгруппировать по этому столбцу, взяв max
и min
из checkout
и checkin
соответственно:
select @checkinLag := null, @rn := 0;
select max(id),
functionario,
loja,
min(checkin),
max(checkout)
from (
select case when (checkinLag is null and checkin is not null) or
(checkinLag is not null and checkin is null)
then @rn := @rn + 1 else @rn end rn,
checkin,
checkout,
loja,
id,
functionario
from (
select @checkinLag checkinLag,
@checkinLag := checkin,
checkin,
checkout,
loja,
id,
functionario
from dummyTable
order by coalesce(checkin, checkout)
) a
) a group by functionario, loja, rn
Я использовал подзапросы, чтобы гарантировать порядок вычисления выражений (присваивание и использование @checkinLag
), как указал Гордон Линофф.
Демо