Presto - разделить массив по определенному значению - PullRequest
0 голосов
/ 26 июня 2019

Я хочу разделить массив по определенному значению. Вот, скажи 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 голосов
/ 20 июля 2019

Это не красиво, но вы можете сделать это, используя 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])])).

...