Presto-按一定值分割数组

时间:2019-06-26 07:05:14

标签: arrays presto

我想将数组拆分为某个值。在这里说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]]

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])]))。