首页 > 解决方案 > Presto - 按特定值拆分数组

问题描述

我想将数组拆分为某个值。在这里,说 1

我尝试使用“转换”,但无法取得进展,并且“拆分”对字符串很有用。

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

标签: arrayspresto

解决方案


它不漂亮,但你可以使用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]])。

在处理输入数组中的每个元素时,如果它是 a 1,则将一个新组添加到状态 ( concat(state, array[value]))。否则,该值将添加到迄今为止派生的最后一个组 ( concat(slice(state, 1, cardinality(state) - 1), array[concat(slice(state, -1, 1)[1], array[value])]))。


推荐阅读