presto函数检查数组是否包含子数组

时间:2018-03-13 09:44:44

标签: sql presto

我有一个包含列数组的Presto数据库,其中包含例如:

  1. ID1,[1,2,3,4]
  2. ID2,[3,4,5,6]
  3. id3,[3,4,7,8]
  4. ID4,[5,4,3,6]
  5. 我需要以正确的顺序搜索哪些行包含数组[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

1 个答案:

答案 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