#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);