arrays - 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]]
解决方案
它不漂亮,但你可以使用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])])
)。
推荐阅读
- javascript - 如何处理 MongoDB/mongoose 中的转换错误
- apache-kafka - 在尝试开始使用休息代理时出现错误“未找到消费者实例”,即使提供了正确的消费者实例 ID
- java - 想立即将数据保存到数据库中的表中
- java - 如何在 JUnit 5 Java 中模拟 JsonWebToken 库
- c# - 从特定日期时间从 db 获取所有记录
- idris - Idris:是否可以通过接口限制函数输出?
- sql - 基本 SQL 查询协助
- python - 如何使用间隔索引向熊猫数据框添加一行
- javascript - 从 Form 创建一个对象数组
- c++ - 声明期间的 C++ 赋值运算符