Это место, где удобно использовать боковое соединение :
select a.*, b.date, b.shipmentvalue
from a left join lateral
(select b.*
from b
where b.storenumber = a.storenumber and
b.matnumber = a.matnumber and
b.date <= a.date
order by b.date desc
fetch first 1 row only
) b
on 1=1; -- returns rows in a even when there are no matches
РЕДАКТИРОВАТЬ:
Wow. Снежинка реализует боковые соединения, а затем ограничивает их фундаментальным образом. Другой метод более дорогой, но должен работать:
select ab.*, b.shipmentValue
from (select a.StoreNumber, a.MatNumber, a.Date, max(b.date) as b_date, b.shipmentvalue
from a left join
b
on b.storenumber = a.storenumber and
b.matnumber = a.matnumber and
b.date <= a.date
group by a.StoreNumber, a.MatNumber, a.Date
) ab join
b
on b.storenumber = ab.storenumber and
b.matnumber = ab.matnumber and
b.date <= ab.b_date