Последовательность шаблонов в диапазоне дат / времени

#sql #hive

#sql #улей

Вопрос:

У меня проблема, по которой мне нужна помощь..

В приведенном ниже примере, если я хочу получить сценарии на основе шаблонов данных 010 как scenario1, 000 как scenario2, 111 как scenario3 в пределах идентификатора .. Игнорируйте записи, которые не соответствуют шаблону..

Пример:

 id  date        Status
1   2012-10-18  1
1   2012-10-19  1
1   2012-10-20  0
1   2012-10-21  0
1   2012-10-22  0
1   2012-10-23  0
1   2012-10-24  1
1   2012-10-25  0
1   2012-10-26  0
1   2012-10-27  0
1   2012-10-28  1
2   2012-10-19  0
2   2012-10-20  0
2   2012-10-21  0
2   2012-10-22  1
2   2012-10-23  1

scenario1:
1   2012-10-23  0
1   2012-10-24  1
1   2012-10-25  0

Scenario2:
1   2012-10-20  0
1   2012-10-21  0
1   2012-10-22  0
2   2012-10-19  0
2   2012-10-20  0
2   2012-10-21  0

Scenario3 - none (no records)
  

Ответ №1:

Вы можете создавать шаблоны в виде строк, а затем использовать сравнение строк.

По крайней мере, часть хитрости заключается в том, что вам нужны все строки в шаблоне, поэтому вам нужно создать все потенциальные шаблоны, в которых может появиться каждая строка:

 select t.*
from (select t.*,
             concat(lag(status), -2) over (partition by id order by date),
                    lag(status), -1) over (partition by id order by date),
                    status
                   ) as pat1,
             concat(lag(status), -1) over (partition by id order by date),
                    status,
                    lead(status), 1) over (partition by id order by date)
                   ) as pat2,
             concat(status,
                    lead(status), 1) over (partition by id order by date),
                    lead(status), 2) over (partition by id order by date)
                   ) as pat3
      from t
     ) t
where '010' in (pat1, pat2, pat3);