我有一个包含列数组的Presto数据库,其中包含例如:
我需要以正确的顺序搜索哪些行包含数组[3,4,5]。 因此,例如结果应该只返回id2而不是id4。
我可以将array_intersect与基数结合使用来查找id2,id4,但我不知道如何验证id2或id4的顺序是否正确。
我能想到的唯一丑陋的解决方案是将两个数组转换为字符串,然后执行类似操作的字符串。
有更好的想法吗?
遵循以下建议并使用AWS Athena:
WITH dataset AS (
(values array[1,2,3,4],
array[3,4,5,6],
array[3,4,7,8],
array[5,4,3,6])
)
SELECT ngrams FROM dataset t(ngrams) where reduce(
transform(array[3,4,5], a -> array_position(ngrams, a)),
0,
(s, n) -> if( s < 0, -1, if ( n > s, n, -1)),
s -> s >= 0) ;
我得到的错误是:
SYNTAX_ERROR:第7:44行:意外的参数(array(bigint), 整数, com.facebook.presto.sql.analyzer.TypeSignatureProvider@1d8b3792, com.facebook.presto.sql.analyzer.TypeSignatureProvider@563900c2)for 功能减少。预期:减少(数组(T),S,函数(S,T,S), 函数(S,R))T,S,R
答案 0 :(得分:0)
这给你带来了魔力:
select x
from (values
array[1,2,3,4],
array[3,4,5,6],
array[3,4,7,8],
array[5,4,3,6]) t(x)
where reduce(
transform(array[3,4,5], a -> array_position(x, a)),
0,
(s, n) -> if( s < 0, -1, if ( n > s, n, -1)),
s -> s >= 0)
上面找到查询数组中的每个元素,如果位置数组正在增加则返回true。 这仍然有很多需要解决的问题(处理重复或差距),但我希望这是你可以开始使用的。
有关详细信息,请参阅https://prestosql.io/docs/current/functions/array.html