Это требует рекурсивного CTE. Вот как я подхожу к этому, с прекрасной изменчивой таблицей для некоторых типовых данных.
create volatile table vt_foo
(names varchar(100), start_date date, orders int, items int)
on commit preserve rows;
insert into vt_foo values ('AAA','2020-01-01',300,100);
insert into vt_foo values ('BAA','2020-02-01',896,448);
insert into vt_foo values ('CCC','2020-03-01',525,100); -
with recursive cte (names, start_date,items, num, counter) as (
select
names,
start_date,
items,
round(orders /( items * 1.0) ) as num ,
1 as counter
from vt_foo
UNION ALL
select
a.names,
a.start_date,
a.items,
b.num,
b.counter + 1
from vt_foo a
inner join cte b
on a.names = b.names
and a.start_date =b.start_date
where b.counter + 1 <= b.num
)
select * from cte
order by names,start_date
Этот бит: b.counter + 1 <= b.num
является ключом к ограничению вывода соответствующим количеством строк на продукт / дату ,
Я думаю, что все должно быть в порядке, но протестируйте его с небольшими объемами данных.