我需要2对部分的分割数组,只需要附近的值。 例如,我有以下数组:
select array[1,2,3,4,5]
我希望获得包含以下值的4行:
{1,2}
{2,3}
{3,4}
{4,5}
我可以通过SQL查询来完成吗?
答案 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