Ниже для BigQuery Standard SQL
#standardSQL
WITH search_events AS (
SELECT ['firstevent', 'secondevent', 'thirdevent'] search
), temp AS (
SELECT *, REGEXP_EXTRACT(events, CONCAT(search, r',(\w*)')) FinalEvent
FROM (
SELECT id, [time1, time2, time3, time4, time5] times,
(SELECT STRING_AGG(event) FROM UNNEST([event1, event2, event3, event4, event5]) event) events,
(SELECT STRING_AGG(search) FROM UNNEST(search) search) search
FROM `project.dataset.table`, search_events
)
)
SELECT FinalEvent,
times[SAFE_OFFSET(ARRAY_LENGTH(REGEXP_EXTRACT_ALL(REGEXP_EXTRACT(events, CONCAT(r'(.*?)', search, ',', FinalEvent )), ',')) + 3)] time
FROM temp
WHERE IFNULL(FinalEvent, '') != ''
Если применить к образцу данных из вашего вопроса - результат будет
Row FinalEvent time
1 fourthevent 10:03
2 fifthevent 10:25
Итак, как вы можете видеть - все окончательные событияизвлечено вместе с их соответствующим временем
Теперь вы можете сделать здесь любую аналитику, которая вам нужна - я не был уверен в логике AverageTimeBetweenFinalEvents
, поэтому я оставляю это вам - особенно потому, что я думаю, что основной фокус вопроса былизвлечение этих заключительных событий
Не могли бы вы предоставить логику этого утверждения, пожалуйста?
times[SAFE_OFFSET(ARRAY_LENGTH(REGEXP_EXTRACT_ALL(REGEXP_EXTRACT(events, CONCAT(r'(.*?)', search, ',', FinalEvent )), ',')) + 3)] time
Конечно, надежда ниже помогает получитьлогика этого выражения
- собрать регулярное выражение, чтобы извлечь список событий, произошедших до соответствующих событий
- извлечь эти события
- извлечь все запятые в массив
- вычислить позицию конечного события, взяв число запятых в указанном выше массиве + 3 (три - для отражения количества позиций в последовательности поиска)
- извлечь соответствующее время как элемент массива times