在PostgreSQL中按部分拆分数组

时间:2017-10-02 15:58:26

标签: sql postgresql

我需要2对部分的分割数组,只需要附近的值。 例如,我有以下数组:

select array[1,2,3,4,5]

我希望获得包含以下值的4行:

{1,2}
{2,3}
{3,4}
{4,5}

我可以通过SQL查询来完成吗?

2 个答案:

答案 0 :(得分:2)

select a
from (
    select array[e, lead(e) over()] as a
    from unnest(array[1,2,3,4,5]) u(e)
) a
where not exists (
    select 1
    from unnest(a) u (e)
    where e is null
);
   a   
-------
 {1,2}
 {2,3}
 {3,4}
 {4,5}

答案 1 :(得分:0)

一种选择是使用递归cte执行此操作。从数组中的第一个位置开始,直到最后一个位置。

with recursive cte(a,val,strt,ed,l) as 
(select a,a[1:2] as val,1 strt,2 ed,cardinality(a) as l 
 from t
 union all
 select a,a[strt+1:ed+1],strt+1,ed+1,l
 from cte where ed<l
)
select val from cte
cte中的

a是数组。

如果你知道数组的最大长度,另一个选择是使用generate_series来获取从1到最大长度的所有数字,并在基数上交叉加入数组表。然后使用lead获取数组的切片并省略最后一个切片(对于给定分区,最后一行的lead将为null)。

with nums(n) as (select * from generate_series(1,10))
select a,res 
from (select a,t.a[nums.n:lead(nums.n) over(partition by t.a order by nums.n)] as res
      from nums
      cross join t 
      where cardinality(t.a)>=nums.n
     ) tbl
where res is not null