Sie sollten lag()
verwenden und lead()
Funktionen im Datensatz auf eine einzelne Zeile pro Paar (client_id, rank)
reduziert :
select
client_id, order_id, product_id,
t.year, rank, prev_year, next_year
from my_table t
join (
select distinct on (client_id, rank)
client_id, rank, year,
lag(year) over w as prev_year,
lead(year) over w as next_year
from my_table
window w as (partition by client_id order by rank)
order by 1, 2, 3 desc
) s using (client_id, rank)
order by client_id, rank
client_id | order_id | product_id | year | rank | prev_year | next_year
-----------+----------+------------+------+------+-----------+-----------
1 | 1 | 212346 | 1995 | 1 | | 1998
1 | 1 | 912346 | 1995 | 1 | | 1998
1 | 1 | 111345 | 1995 | 1 | | 1998
1 | 2 | 133368 | 1998 | 4 | 1995 | 2005
1 | 2 | 233368 | 1998 | 4 | 1995 | 2005
1 | 3 | 412341 | 2005 | 6 | 1998 |
2 | 55 | 312344 | 1995 | 1 | | 1999
2 | 57 | 812343 | 1999 | 2 | 1995 |
(8 rows)