Mysql 如何对重复值进行分组以查找序列的开始和结束?

Mysql 如何对重复值进行分组以查找序列的开始和结束?,mysql,grouping,Mysql,Grouping,我有一个包含以下数据的表 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

我有一个包含以下数据的表

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个值都被合并。有什么建议吗?

我知道这是一个老问题,但这可能仍然会对某人有所帮助

为了解决这个问题,我假设日期是连续的。然后,我加入了数据,首先是“昨天”的数据,然后是“明天”的数据,并获取那些标志值已更改的行-这标记了给定系列的开始和结束日期。为了匹配开始日期和结束日期,我对每个系列进行了排序,分配了一个计数器,并加入了这个计数器

代码如下:

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 here:

我知道这是一个老问题,但这可能仍然对某些人有帮助

为了解决这个问题,我假设日期是连续的。然后,我加入了数据,首先是“昨天”的数据,然后是“明天”的数据,并获取那些标志值已更改的行-这标记了给定系列的开始和结束日期。为了匹配开始日期和结束日期,我对每个系列进行了排序,分配了一个计数器,并加入了这个计数器

代码如下:

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 here:

See-非常相似的问题您可以更清楚地指定所需输出的基础是什么吗?See-非常相似的问题您可以更清楚地指定所需输出的基础是什么吗?