Вы можете использовать ROW_NUMBER()
для симуляции LAG/LEAD
:
with prep as (
select
nr, CAST(collect(grd) AS tbl_array) grds,ROW_NUMBER() OVER(ORDER BY nr) AS rn
from tab
group by nr
)
select p.nr, p.grds, p2.grds AS lead_grds
--, lead(grds) over (order by nr) as lead_grds
from prep p
LEFT JOIN prep p2
ON p2.rn = p.rn +1;
Выход из подготовительного:
┌──────────────────────┬────────────────────────────────┬────┐
│ NR │ GRDS │ RN │
├──────────────────────┼────────────────────────────────┼────┤
│ 00000000000000000001 │ HR.TBL_ARRAY('06', '21', '06') │ 1 │
│ 00000000000000000002 │ HR.TBL_ARRAY('06', '21') │ 2 │
│ 00000000000000000004 │ HR.TBL_ARRAY('01') │ 3 │
└──────────────────────┴────────────────────────────────┴────┘
Вывод всего запроса:
┌──────────────────────┬──────────────────────────────┬──────────────────────────┐
│ NR │ GRDS │ LEAD_GRDS │
├──────────────────────┼──────────────────────────────┼──────────────────────────┤
│ 00000000000000000001 │HR.TBL_ARRAY('06', '21', '06')│ HR.TBL_ARRAY('06', '21') │
│ 00000000000000000002 │HR.TBL_ARRAY('06', '21') │ HR.TBL_ARRAY('01') │
│ 00000000000000000004 │HR.TBL_ARRAY('01') │ │
└──────────────────────┴──────────────────────────────┴──────────────────────────┘
Эквивалент в PostgreSQL:
WITH prep AS (
SELECT NR, ARRAY_AGG(GRD) AS grds
FROM tab
GROUP BY NR
)
SELECT prep.*, LEAD(grds) OVER(ORDER BY nr) AS lead_grds
FROM prep;
Демоверсия DBFiddle