Question: I need split array by 2-pair portions, only nearby values.
For example I have following array:

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

```

And I want to get 4 rows with following values:

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

```

Can I do it by SQL query?

Answer: 
```
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}

```
One option is to do this with a recursive cte. Starting from the first position in the array and going up to the last.

```
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

```

`a` in the cte is the array.

Another option if you know the max length of the array is to use `generate_series` to get all numbers from 1 to max length and cross joining the array table on cardinality. Then use `lead` to get slices of the array and omit the last one (as `lead` on last row for a given partition would be `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

```