Return 行具有 3 个或更多连续值作为 1,排序依据日期和分组按地区

Return rows that has 3 or more consecutive values as 1 with Order by on Date & Group By Region

我尝试了 Tabibitosan 方法但没有帮助。您能否针对以下情况提出一些其他解决方案。

使用 Oracle 11g:

请找到下面的table格式,

Region  Date      Value
East    1/1/2018    1
East    1/2/2018    1
East    1/3/2018    0
East    1/4/2018    1
East    1/5/2018    1
East    1/7/2018    1
West    1/9/2018    0
West    1/10/2018   0
West    2/3/2018    1
West    2/4/2018    1
East    2/5/2018    1
West    2/8/2018    0
West    2/9/2018    0
West    2/10/2018   0

根据以上 table 我应该 return 值 1 的行在日期(排序依据)和地区方面出现 3 次或更多次。

**My Output:**

    Region  Date       Value
    East    1/4/2018    1
    East    1/5/2018    1
    East    1/7/2018    1

注意:日期列中的日期可能不包含所有日期。比如说,在上面的 1/6/2018 中缺少这很好。当按 'Date' 排序时,我需要查找 'Value' 列,该列有 1 个连续的 3 行或更多行。

只需使用lead():

select t.*
from (select t.*,
             lead(value) over (partition by region order by date) as value_1,
             lead(value, 2) over (partition by region order by date) as value_2
      from t
     ) t
where value = 1 and value_1 = 1 and value_2 = 1;

如果您连续有 4 个或更多并且只想要第一个,您可以添加 lag():

select t.*
from (select t.*,
             lag(value) over (partition by region order by date) as prev_value,
             lead(value) over (partition by region order by date) as value_1,
             lead(value, 2) over (partition by region order by date) as value_2
      from t
     ) t
where value = 1 and value_1 = 1 and value_2 = 1 and
      (prev_value is null or prev_value <> 1);

如果您希望获取所有符合条件的行,请尝试以下操作。

with data
  as (
select x.region,x.date1,x.value,x.pattern_start,x.rnk
 from (
select region
       ,date1
       ,value
       ,row_number() over(order by region,date1) as rnk
       ,case when value=1 
                    and lead(value,1) over(partition by region order by date1) = 1
                    and lead(value,2) over(partition by region order by date1) = 1
                   then row_number() over(order by region,date1)
        end  as pattern_start   
       ,lead(value,2) over(partition by region order by date1) as next_val_2
       ,lead(value,3) over(partition by region order by date1) as next_val_3
 from t)x
     )
select *
  from data y
 where y.rnk in (select pattern_start from data union all
                 select pattern_start+1 from data union all
                 select pattern_start+2 from data
                  )
order by 1,2     

演示Link https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=1aa6d5de2b0ec375f659d0243aba350a