Вернуть строки с 3 или более последовательными значениями, равными 1, с Упорядочить по дате и Группировать по региону - PullRequest
0 голосов
/ 23 ноября 2018

Я пробовал метод Табибитозан, но не помог.Можете ли вы предложить другое решение для сценария ниже.

Использование Oracle 11g:

Пожалуйста, найдите формат таблицы ниже,

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

Из таблицы выше, я должен вернутьсястроки со значением 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 отсутствует, что нормально.Мне нужно искать столбец «Значение», который имеет 1 подряд для 3 или более строк, когда упорядочено по «Дата».

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Попробуйте следующее, если хотите получить все строки, соответствующие условию.

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     

Демонстрационная ссылка https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=1aa6d5de2b0ec375f659d0243aba350a

0 голосов
/ 23 ноября 2018

Просто используйте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...