Вместо того, чтобы думать о нем как о «нескольких рядах», думайте о нем как о диапазоне .
Это делает то, что вы хотите:
select i.since, v.val
from intervals i
join vals v on v.val between i.since and
(select min(since) - 1 from intervals where since > i.since)
order by 1, 2;
Тестовый код (запускается на postgres согласно вопросу ОП):
create table intervals (since int);
create table vals (val int);
insert into intervals values (1), (4), (8), (20), (500);
insert into vals values (1), (2), (3), (4), (5), (6), (7), (8), (9), (100);
Вывод вышеуказанного запроса:
1 1
1 2
1 3
4 4
4 5
4 6
4 7
8 8
8 9
20 100