. 这似乎为您的示例数据生成了正确的结果(这是一个MySQL FIDLE,因为据我所知没有BQ FIDLE,但逻辑是相同的,这是标准SQL)。谢谢你的及时回复。我将您的解决方案插入到我的查询中,但它不会输出我要查找的内容。让我们以第3个活动块为例,它由第3

. 这似乎为您的示例数据生成了正确的结果(这是一个MySQL FIDLE,因为据我所知没有BQ FIDLE,但逻辑是相同的,这是标准SQL)。谢谢你的及时回复。我将您的解决方案插入到我的查询中,但它不会输出我要查找的内容。让我们以第3个活动块为例,它由第3,sql,database,group-by,google-bigquery,gaps-and-islands,Sql,Database,Group By,Google Bigquery,Gaps And Islands,. 这似乎为您的示例数据生成了正确的结果(这是一个MySQL FIDLE,因为据我所知没有BQ FIDLE,但逻辑是相同的,这是标准SQL)。谢谢你的及时回复。我将您的解决方案插入到我的查询中,但它不会输出我要查找的内容。让我们以第3个活动块为例,它由第3行和第4行组成。我没有将其合并成一行,而是返回到原始行,其中datetime_end等于前一行的datetime_end。@ronencozen:。这似乎为您的示例数据生成了正确的结果(这是一个MySQL FIDLE,因为据我所知没有BQ FI


. 这似乎为您的示例数据生成了正确的结果(这是一个MySQL FIDLE,因为据我所知没有BQ FIDLE,但逻辑是相同的,这是标准SQL)。谢谢你的及时回复。我将您的解决方案插入到我的查询中,但它不会输出我要查找的内容。让我们以第3个活动块为例,它由第3行和第4行组成。我没有将其合并成一行,而是返回到原始行,其中datetime_end等于前一行的datetime_end。@ronencozen:。这似乎为您的示例数据生成了正确的结果(这是一个MySQL FIDLE,因为据我所知没有BQ FIDLE,但逻辑是相同的,这是标准SQL)@罗南曾。不,如果修改后的问题使答案无效,我不会看。更好的方法是问一个新问题。我明白了,谢谢你对我原来的问题给出了一个很好的回答。@Ronenczen。不,如果修改后的问题使答案无效,我不会看。更好的方法是问一个新问题。我明白了,谢谢你对我原来的问题给出了一个很好的回答。
create table activity as
select "2020-02-25T09:06:12" as datetime_start,  "2020-02-25T09:07:31" as datetime_end, 0 as flag uniuon all 
select "2020-02-25T09:16:08" as datetime_start,  "2020-02-25T09:17:31" as datetime_end, 0 as flag uniuon all 
select "2020-02-25T09:17:31" as datetime_start,  "2020-02-25T09:27:31" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T09:27:31" as datetime_start,  "2020-02-25T09:32:41" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T09:35:57" as datetime_start,  "2020-02-25T09:37:31" as datetime_end, 0 as flag uniuon all 
select "2020-02-25T09:49:23" as datetime_start,  "2020-02-25T09:51:16" as datetime_end, 0 as flag uniuon all 
select "2020-02-25T09:51:16" as datetime_start,  "2020-02-25T10:03:46" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T10:03:46" as datetime_start,  "2020-02-25T10:05:57" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T10:05:57" as datetime_start,  "2020-02-25T10:07:31" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T10:07:31" as datetime_start,  "2020-02-25T10:10:22" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T10:10:22" as datetime_start,  "2020-02-25T10:12:55" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T10:12:55" as datetime_start,  "2020-02-25T10:20:17" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T10:20:17" as datetime_start,  "2020-02-25T10:27:40" as datetime_end, 1 as flag uniuon all 
select "2020-02-25T10:27:40" as datetime_start,  "2020-02-25T10:39:51" as datetime_end, 1 as flag;
select
    min(datetime_start) datetime_stat,
    max(datetime_end) datetime_end,
    flag
from (
    select
        t.*,
        sum(case when flag = 1 and lag_flag = 1 then 0 else 1 end) 
            over(order by datetime_start) grp
    from (
        select 
            t.*,
            lag(flag) over(order by datetime_start) lag_flag
        from mytable t
    ) t
) t
group by flag, grp
with activity as (
    select "2020-02-25T09:06:12" as datetime_start,  "2020-02-25T09:07:31" as datetime_end, 0 as flag union all 
    select "2020-02-25T09:16:08" as datetime_start,  "2020-02-25T09:17:31" as datetime_end, 0 as flag union all 
    select "2020-02-25T09:17:31" as datetime_start,  "2020-02-25T09:27:31" as datetime_end, 1 as flag union all 
    select "2020-02-25T09:27:31" as datetime_start,  "2020-02-25T09:32:41" as datetime_end, 1 as flag union all 
    select "2020-02-25T09:35:57" as datetime_start,  "2020-02-25T09:37:31" as datetime_end, 0 as flag union all 
    select "2020-02-25T09:49:23" as datetime_start,  "2020-02-25T09:51:16" as datetime_end, 0 as flag union all 
    select "2020-02-25T09:51:16" as datetime_start,  "2020-02-25T10:03:46" as datetime_end, 1 as flag union all 
    select "2020-02-25T10:03:46" as datetime_start,  "2020-02-25T10:05:57" as datetime_end, 1 as flag union all 
    select "2020-02-25T10:05:57" as datetime_start,  "2020-02-25T10:07:31" as datetime_end, 1 as flag union all 
    select "2020-02-25T10:07:31" as datetime_start,  "2020-02-25T10:10:22" as datetime_end, 1 as flag union all 
    select "2020-02-25T10:10:22" as datetime_start,  "2020-02-25T10:12:55" as datetime_end, 1 as flag union all 
    select "2020-02-25T10:12:55" as datetime_start,  "2020-02-25T10:20:17" as datetime_end, 1 as flag union all 
    select "2020-02-25T10:20:17" as datetime_start,  "2020-02-25T10:27:40" as datetime_end, 1 as flag union all 
    select "2020-02-25T10:27:40" as datetime_start,  "2020-02-25T10:39:51" as datetime_end, 1 as flag
    )
select min(datetime_start) as datetime_stat,
       max(datetime_end) as datetime_end,
       flag
from (select a.*,
             countif( datetime_start <> prev_datetime_end OR
                      prev_flag <> flag
                    ) over (order by datetime_start) as grp
       from (select a.*,
                    lag(flag) over (order by datetime_start) as prev_flag,
                    lag(datetime_end) over (order by datetime_start) as prev_datetime_end
             from activity a
            ) a
) t
group by flag, grp