Използвал съм row_count()
тъй като са необходими последователни номера на редове. Не трябва да разчитате на първичния ключ, защото той обикновено може да съдържа пропуски.
with recursive cte as (
select *, row_number() over (order by id)
from measurements
),
work_table as (
select
id,
count as count_sum,
volume as volume_sum,
row_number
from cte
where row_number = 1
union all
select
c.id,
case when w.volume_sum >= 100
then c.count
else w.count_sum + c.count
end as count_sum,
case
when w.volume_sum >= 100
then c.volume
else w.volume_sum + c.volume
end as discrete_sum_volume,
c.row_number
from cte c
join work_table w
on c.row_number = w.row_number + 1
)
select count_sum, volume_sum
from work_table
where volume_sum >= 100
or id = (select max(id) from work_table)
order by id
Резултат:
count_sum | volume_sum
-----------+------------
87 | 111
49 | 100
2 | 16.5
(3 rows)