我想将数组拆分为某个值。在这里说1
我尝试使用“ transform”,但无法进行,“ split”对字符串很有用。
Input : [1,8,2,1,4,5,6,1,1,4,2,4,1]
Expected Output : [[1,8,2],[1,4,5,6],[1],[1,4,2,4],[1]]
答案 0 :(得分:0)
这不是很漂亮,但是您可以使用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])])
)。