Как сгруппировать повторяющиеся значения, чтобы найти начало и конец серии? - PullRequest
2 голосов
/ 06 августа 2010

У меня есть таблица со следующими данными.

serial   date     flag
1        1 aug    1
2        2 aug    1
3        3 aug    0   
4        4 aug    0
5        5 aug    1
6        6 aug    1
7        7 aug    1

Мне нужен этот набор результатов:

from     to       flag
1-aug    2-aug    1
3-Aug    4-Aug    0
5-Aug    7-Aug    1

Когда я группирую по флагу, все значения 1 объединяются. Есть предложения?

1 Ответ

0 голосов
/ 01 ноября 2012

старый вопрос, я знаю, но это все еще может помочь кому-то ...

, чтобы решить это, я предположил, что дата будет последовательной.Затем я соединил данные, сначала со «вчерашними» данными, а затем с «завтрашними» данными и взял те строки, в которых значение флага изменилось - это отмечает даты начала и окончания данной серии.чтобы сопоставить даты начала и даты окончания, я заказал каждую серию, назначил счетчик и присоединился к этому счетчику.

вот код:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...