Ну можно это в несколько шагов сделать. 1) трансформируйте ваши значения в номера колонок, типа такого transform( checkpoint_code , [ 'B_rule_1sec_0', 'A_rule_1sec_1', 'B_rule_1sec_1', ... ], [1,2,3, ...], 0) as arr_index,2) погруппируйте данные по session_id, arr_index cобирая попутно synchronized_event_time select session_id, transform( ... ) as arr_index, any(synchronized_event_time) as some_synchronized_event_time group by session_id, arr_index3) поверх всего этого сделайте группировку по session_id и собирая таймстампы в таблицы в нужные позиции с помощью groupArrayInsertAt: select session_id, groupArrayInsertAt( some_synchronized_event_time, arr_index ) from ( ... предыдущий селект ... ) group by session_id4) на выходе получите примерно то на что расчитывали, только не в колонках а в таблице. и должно работать ощутимо быстрее. Таблицы могут не иметь хвостовых элементов, но это ни в чем не мешает. 5) потом по этим таблицам можно ездить аггрегациями c -ForEach или функциями высшего порядка. Или тупо повытаскивать отдельные элементы таблицы в колонки и делать то что вам там нужно.
Обсуждают сегодня