старый вопрос, я знаю, но это все еще может помочь кому-то ...
, чтобы решить это, я предположил, что дата будет последовательной.Затем я соединил данные, сначала со «вчерашними» данными, а затем с «завтрашними» данными и взял те строки, в которых значение флага изменилось - это отмечает даты начала и окончания данной серии.чтобы сопоставить даты начала и даты окончания, я заказал каждую серию, назначил счетчик и присоединился к этому счетчику.
вот код:
SET @cnt1 := 0;
SET @cnt2 := 0;
select firstdate, lastdate, startDates.flag from
(
select @cnt2 := @cnt2 + 1 as i, table1.date as firstdate, table1.flag from table1
left join (
select DATE_ADD(date, INTERVAL 1 DAY) as dateplus1, date, flag from table1
) plus1 on table1.date = plus1.dateplus1
where table1.flag <> IFNull(plus1.flag,-1)
order by table1.date
) startDates
inner join
(
select @cnt1 := @cnt1 + 1 as i, table1.date as lastdate, table1.flag from table1
left join (
select DATE_ADD(date, INTERVAL -1 DAY) as dateminus1, date, flag from table1
) minus1 on table1.date = minus1.dateminus1
where table1.flag <> IFNull(minus1.flag,-1)
order by table1.date
) endDates on startDates.i = endDates.i
;
sql fiddle здесь: http://sqlfiddle.com/#!2/25594/1/2