Это не красиво, но вы можете сделать это, используя reduce
:
WITH t(a) AS (VALUES
array[1,8,2,1,4,5,6,1,1,4,2,4,1],
array[8,2,1,4,5,6,1,1,4,2,4,1]
)
SELECT
reduce(
a,
array[array[-1]],
(state, value) -> case
when value = 1 then
concat(state, array[value])
else
concat(slice(state, 1, cardinality(state) - 1), array[concat(slice(state, -1, 1)[1], array[value])])
end,
state -> slice(state, 2, cardinality(state) - 1)
)
FROM t
Идея состоит в том, чтобы использовать массив в качестве значения состояния, который будет содержать все группы, полученные до сих пор. Он инициализируется единственной группой, содержащей произвольное значение (array[array[-1]]
), чтобы обойти неопределенность при выводе типа. Эта группа отбрасывается при получении результатов (array[array[-1]]
).
Поскольку каждый элемент во входном массиве обрабатывается, если это 1
, в состояние добавляется новая группа (concat(state, array[value])
). В противном случае значение добавляется к последней полученной группе (concat(slice(state, 1, cardinality(state) - 1), array[concat(slice(state, -1, 1)[1], array[value])])
).